Saya harus mengatakan saya tidak mengerti kelas pencacahan Scala. Saya dapat menyalin-tempel contoh dari dokumentasi, tetapi saya tidak tahu apa yang sedang terjadi.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
- Apa artinya
type WeekDay = Value
dan mengapa saya harus menulis itu? - Mengapa
val Mon = Value
? Apa artinya itu? - Mengapa saya harus mengimpor
WeekDay
objek? Dan, - ketika saya menulis
val day = WeekDay.Mon
, mengapa itu mengetikWeekDay.Value
, bukan mengetikWeekDay
?
Jawaban:
yang
Enumeration
sifat memiliki anggota jenisValue
yang mewakili unsur-unsur individual dari pencacahan (itu sebenarnya kelas batin, tetapi perbedaannya tidak penting di sini).Jadi
object WeekDay
mewarisi anggota tipe itu. Garistype WeekDay = Value
tersebut hanyalah sebuah alias tipe . Ini berguna, karena setelah Anda mengimpornya ke tempat lain denganimport WeekDay._
, Anda dapat menggunakan jenis itu, misalnya:Sebaliknya, versi minimalnya adalah:
dan Anda tidak perlu mengimpor konten
object WeekDay
, tetapi Anda harus menggunakan typeWeekDay.Value
dan untuk memenuhi syarat anggota individu. Jadi contohnya akan menjadiPertanyaan kedua adalah tentang arti dari
val Mon, ... = Value
. Ini memang sangat membingungkan jika Anda tidak melihat ke dalam implementasinyaEnumeration
. Ini bukan penugasan tipe! Hal ini bukan memanggil dilindungi metode dengan nama yang sama ,Value
yang mengembalikan contoh konkret dari jenisValue
.Hal ini terjadi bahwa Anda dapat menulis
val a, b, c = foo
di Scala, dan untuk setiap nilaia
,b
danc
metodefoo
akan dipanggil lagi dan lagi.Enumeration
menggunakan trik ini untuk menaikkan penghitung internal sehingga setiap nilai bersifat individual.Jika Anda membuka dokumen Scala API
Enumeration
dan mengkliknyaVisibility: All
, Anda akan melihat metode itu muncul.sumber
Open(Mon, 8, 20)
dan hari-hari akan tetap menjadi pencacahan datar.