Enumeration
ลักษณะมีสมาชิกประเภทValue
ตัวแทนของแต่ละองค์ประกอบของการแจงนับ (ก็จริงระดับชั้น แต่ความแตกต่างไม่ได้เรื่องที่นี่)
จึงobject WeekDay
สืบทอดสมาชิกประเภทนั้น บรรทัดtype WeekDay = Value
เป็นเพียงนามแฝงประเภท มันมีประโยชน์เพราะหลังจากที่คุณนำเข้าที่อื่นimport WeekDay._
แล้วคุณสามารถใช้ประเภทนั้นได้เช่น:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
แต่เวอร์ชันขั้นต่ำจะเป็น:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
และคุณไม่ต้องนำเข้าเนื้อหาของobject WeekDay
แต่จากนั้นคุณจะต้องใช้ประเภทWeekDay.Value
และเพื่อตรวจสอบคุณสมบัติสมาชิกแต่ละคน ดังนั้นตัวอย่างจะกลายเป็น
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
คำถามที่สองเกี่ยวกับความหมายของval Mon, ... = Value
. Enumeration
นี้แน่นอนมากทำให้เกิดความสับสนถ้าคุณไม่ได้มองเข้าไปในการดำเนินงานของ นี่ไม่ใช่การกำหนดประเภท! มันถูกเรียกแทนป้องกันวิธีการที่มีชื่อเดียวกัน , ซึ่งจะส่งกลับอินสแตนซ์ที่เป็นรูปธรรมของประเภทValue
Value
มันจึงเกิดขึ้นที่คุณสามารถเขียนval a, b, c = foo
ใน Scala และสำหรับแต่ละค่าa
, b
และc
วิธีการที่foo
จะได้รับการเรียกอีกครั้งและอีกครั้ง Enumeration
ใช้เคล็ดลับนี้เพื่อเพิ่มตัวนับภายในเพื่อให้แต่ละค่าเป็นรายบุคคล
หากคุณเปิดเอกสาร Scala API Enumeration
และคลิกที่Visibility: All
คุณจะเห็นวิธีการดังกล่าวปรากฏขึ้น