Mendeklarasikan Enum
enum mendeklarasikan tipe yang nilainya berupa sekumpulan varian bernama yang tetap:
enum Status {
ready,
failed,
}
Sekarang Status adalah tipe dengan tepat dua nilai: Status.ready dan Status.failed. Tidak ada nilai lain yang bisa menjadi Status.
Grammar-nya sengaja dibuat sangat kecil:
enum Name {membuka deklarasi.- Setiap baris berisi satu nama varian, dipisahkan koma.
}menutupnya.
Tidak ada payload, tidak ada nilai pembeda, tidak ada method turunan. Itulah yang membuat enum tetap menjadi "sum type kecil" di Zero.
Memakai Enum
Kamu menyebut sebuah varian dengan menuliskan nama tipe enum di depannya:
let state: Status = Status.ready
Anotasi : Status bersifat opsional kalau sisi kanan sudah menentukan tipenya. Dalam sebagian besar kasus, kamu bisa menulis:
let state = Status.ready
dan compiler akan menginferensi tipenya sebagai Status.
Membandingkan Nilai Enum
Dua nilai enum sama kalau keduanya varian yang sama:
if state == Status.ready {
check world.out.write("ready\n")
} else {
check world.out.write("not ready\n")
}
Itulah cara paling sederhana untuk membuat percabangan berdasarkan enum. Untuk analisis yang menyeluruh, yaitu menangani setiap varian secara eksplisit, pakai match:
match state {
.ready => { check world.out.write("ready\n") }
.failed => { check world.out.write("failed\n") }
}
Kelebihan match dibandingkan if/else if terlihat saat kamu menambahkan varian ketiga nanti. Compiler akan memberitahumu setiap match yang belum menangani kasus baru itu, sedangkan rangkaian if/else akan diam-diam jatuh ke cabang default-nya.
Choice dan match membahas match lebih detail. Konstruksi ini bekerja untuk enum maupun choice.
Contoh Lengkap
Sampel resmi Zero menaruh enum dan choice berdampingan di file yang sama:
Status tidak melakukan apa-apa di potongan kode ini, karena tujuannya hanya untuk menunjukkan perbedaannya. Varian choice mengikat sebuah payload (value, message) saat dicocokkan, sedangkan varian enum tidak mengikat apa pun karena memang tidak ada yang bisa diikat.
Enum atau Choice: Pohon Keputusan Singkat
Aturan singkatnya:
- Variannya hanya label →
enum. - Variannya harus membawa data →
choice.
Kalau kamu memodelkan state siklus hidup dan suatu saat perlu menempelkan pesan error ke state "failed", ubah tipenya dari enum menjadi choice. Setiap varian mendapat tipe payload, dan setiap cabang match yang memakainya mendapat binding untuk payload itu. Ini refactor yang dipandu langkah demi langkah oleh compiler.
Secara konkret:
// Before - enum, no payloads
enum Status {
ready,
failed,
}
// After - choice with payloads on each variant
choice Status {
ready: Void,
failed: String,
}
Varian yang payload-nya Void hanyalah label dalam bentuk choice. Kamu bisa memakai enum dan choice untuk state logis yang sama. Pilih enum saat kamu memang tidak butuh data yang ditempelkan.
Contoh Pemakaian
Beberapa contoh sehari-hari ketika enum adalah jawaban yang tepat:
- Siklus hidup tanpa metadata.
Loading,Ready,Empty: state murni tanpa payload. - Mode.
Read,Write,Appenduntuk mode membuka file. - Arah.
North,South,East,West. - Level log.
Trace,Debug,Info,Warn,Error. (Nanti kamu mungkin menambahkan pesan, dan saat itulah kamu beralih kechoice.) - Hari dalam seminggu. Contoh klasik.
Setiap kali kamu tergoda memakai konstanta integer ajaib (0 = pending, 1 = active, 2 = done), enum hampir selalu lebih jelas.
Catatan Gaya
- Nama varian huruf kecil sesuai dengan gaya penamaan identifier di bagian lain bahasa Zero.
- Koma di akhir varian terakhir boleh saja (dan disarankan agar diff tetap rapi, karena menambah varian baru tidak mengubah baris sebelumnya).
- Jaga agar daftar enum tetap pendek. Kalau kamu punya belasan varian dan banyak di antaranya butuh payload, mungkin yang kamu butuhkan adalah
choice, atau desain ulang, bukanenumyang lebih besar.
Berikutnya: Choice dan Match
Langkah berikutnya yang wajar adalah saudaranya yang lebih kaya: choice dan match, tipe tagged union di Zero beserta konstruksi pattern matching yang menyertainya.
Pertanyaan yang sering diajukan
Apa itu enum di Zero?
enum mendeklarasikan tipe yang nilainya adalah salah satu dari sekumpulan varian bernama yang tetap, yaitu label tanpa payload tambahan. Contoh: enum Status { ready, failed }. Nilai bertipe Status pasti salah satu dari Status.ready atau Status.failed, dan compiler memastikan hal itu.
Apa bedanya enum dengan choice?
Varian sebuah enum adalah label biasa yang tidak membawa data. choice adalah tagged union: setiap variannya punya tipe payload yang terkait, seperti choice Result { ok: i32, err: String }. Pakai enum saat kamu hanya perlu membedakan kasus berdasarkan nama, dan pakai choice saat setiap kasus membawa informasi tambahan.
Bagaimana cara mengetahui varian enum dari sebuah nilai?
Bandingkan nilainya dengan variannya: if status == Status.ready { ... }. Untuk percabangan yang menyeluruh atas semua varian, pakai match. Compiler akan memberi peringatan kalau ada varian yang terlewat, dan itulah alasan utama memilih match daripada rangkaian if/else if saat nilainya berupa sum type.
Apakah varian enum bisa punya nilai terkait di Zero?
Tidak. Itulah gunanya choice. enum sengaja dibuat sebagai sum type yang paling minimal: setiap varian hanyalah label. Kalau kamu perlu menempelkan i32 atau String ke salah satu varian, kebutuhanmu sudah melampaui enum dan kamu butuh choice.
Kapan sebaiknya memakai enum di Zero?
Pakai enum saat sebuah nilai harus tepat salah satu dari sekumpulan kecil state bernama, dan state itu tidak membawa data tambahan. Contohnya: hari dalam seminggu, warna lampu lalu lintas, state siklus hidup tanpa metadata, atau level log. Kalau kamu ingin menempelkan data ke salah satu varian, beralihlah ke choice.