các Enumeration
đặc điểm có thành viên loại Value
đại diện cho các yếu tố cá nhân thuộc kiểu liệt kê (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).
Do đó object WeekDay
kế thừa thành viên kiểu đó. Dòng type WeekDay = Value
chỉ là một loại bí danh . Nó rất hữu ích, vì sau khi bạn nhập nó ở nơi khác import WeekDay._
, bạn có thể sử dụng kiểu đó, 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ỉ là:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
và bạn không phải nhập nội dung của object WeekDay
, nhưng sau đó bạn sẽ cần sử dụng loại WeekDay.Value
và để đủ điều kiện thành viên cá nhâ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à sự phân công của một kiểu! Thay vào đó, nó gọi một phương thức được bảo vệ có cùng tên , phương thứcValue
này trả về một kiểu cụ thể Value
.
Nó như vậy sẽ xảy ra rằng bạn có thể viết val a, b, c = foo
trong Scala, và cho mỗi giá trị a
, b
và c
phương pháp này foo
sẽ được gọi là 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 bên trong để mỗi giá trị là riêng lẻ.
Nếu bạn mở tài liệu API Scala Enumeration
và nhấp vào Visibility: All
, bạn sẽ thấy phương thức đó xuất hiện.