đặc điểm Enumeration
có một thành phần loại của điều tra (nó thực sự là một lớp bên trong, nhưng sự khác biệt không quan trọng ở đây).
Vì vậy, object WeekDay
kế thừa thành viên loại đó. Dòng type WeekDay = Value
chỉ là một bí danh loại . Nó rất hữu ích, bởi vì sau khi bạn nhập nó ở nơi khác với import WeekDay._
, bạn có thể sử dụng loại, ví dụ:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Thay vào đó, một phiên bản tối thiểu sẽ chỉ được:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
và bạn không đã để nhập nội dung của object WeekDay
, nhưng sau đó bạn sẽ cần phải sử dụng loại WeekDay.Value
và để đủ điều kiện cho từng thành viên. Vì vậy, ví dụ sẽ trở thành
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
Câu hỏi thứ hai là về ý nghĩa của val Mon, ... = Value
. Điều này thực sự rất khó hiểu nếu bạn không nhìn vào việc thực hiện Enumeration
. Đây không phải là nhiệm vụ của một loại! Thay vào đó, hãy gọi phương thức được bảo vệ có cùng tên, Value
, trả về trường hợp cụ thể loại Value
.
Nó như vậy sẽ xảy ra rằng bạn có thể viết val a, b, c = foo
tại Scala, và cho mỗi giá trị a
, b
và c
phương pháp foo
sẽ được gọi một lần nữa và một lần nữa. Enumeration
sử dụng thủ thuật này để tăng bộ đếm nội bộ sao cho mỗi giá trị là riêng lẻ.
Nếu bạn mở tài liệu API Scala cho Enumeration
và nhấp vào Visibility: All
, bạn sẽ thấy phương thức đó xuất hiện.
Tôi đã viết một tổng quan nhỏ về scala Liệt kê và lựa chọn thay thế, bạn có thể thấy nó hữu ích: pedrorijo.com/blog/scala-enums/ – pedrorijo91