Enumerasi

Enum, singkatan dari "enumerations," adalah cara untuk mendefinisikan tipe data kustom yang terdiri dari satu set nilai bernama yang tetap, disebut variant. Enum berguna untuk mewakili kumpulan nilai terkait di mana setiap nilai bersifat berbeda dan memiliki makna tertentu.

Variant dan Nilai Enum

Berikut adalah contoh sederhana dari sebuah enum:

{{#include ../listings/ch06-enums-and-pattern-matching/no_listing_01_enum_example/src/lib.cairo:enum_example}}

Pada contoh ini, kami telah mendefinisikan sebuah enum yang disebut Direction dengan empat variant: North, East, South, dan West. Konvensi penamaan yang digunakan adalah PascalCase untuk variant enum. Setiap variant mewakili nilai yang berbeda dari tipe Direction. Pada contoh ini, variant-variant tidak memiliki nilai terkait. Salah satu variant dapat diinstansiasi menggunakan sintaks ini:

{{#rustdoc_include ../listings/ch06-enums-and-pattern-matching/no_listing_01_enum_example/src/lib.cairo:here}}

Mudah untuk menulis kode yang berbeda tergantung pada variant dari sebuah instance enum, seperti pada contoh ini untuk menjalankan kode spesifik sesuai dengan sebuah Direction. Anda dapat mempelajari lebih lanjut tentang hal ini pada halaman Konstruksi Aliran Kontrol Match.

Enum Kombinasi dengan Tipe Kustom

Enum juga dapat digunakan untuk menyimpan data yang lebih menarik yang terkait dengan setiap variant. Sebagai contoh:

{{#include ../listings/ch06-enums-and-pattern-matching/no_listing_02_enum_message/src/lib.cairo:message}}

Pada contoh ini, enum Message memiliki tiga variant: Quit, Echo, dan Move, masing-masing dengan tipe yang berbeda:

  • Quit tidak memiliki nilai terkait.
  • Echo adalah sebuah bilangan bulat tunggal.
  • Move adalah sebuah tuple dari dua nilai u128.

Anda bahkan dapat menggunakan Struct atau Enum lain yang Anda definisikan di dalam salah satu variant Enum Anda.

Implementasi Trait untuk Enum

Di Cairo, Anda dapat mendefinisikan trait dan mengimplementasikannya untuk enum kustom Anda. Ini memungkinkan Anda untuk mendefinisikan metode dan perilaku yang terkait dengan enum. Berikut contoh dari pendefinisian sebuah trait dan implementasinya untuk enum Message sebelumnya:

{{#include ../listings/ch06-enums-and-pattern-matching/no_listing_02_enum_message/src/lib.cairo:trait_impl}}

Pada contoh ini, kami mengimplementasikan trait Processing untuk Message. Berikut adalah cara penggunaannya untuk memproses pesan Quit:

{{#rustdoc_include ../listings/ch06-enums-and-pattern-matching/no_listing_02_enum_message/src/lib.cairo:main}}

Menjalankan kode ini akan mencetak quitting.

Enum Option dan Keuntungannya

Enum Option adalah enum standar dalam Cairo yang mewakili konsep dari nilai opsional. Enum ini memiliki dua variant: Some: T dan None: (). Some: T menunjukkan bahwa ada sebuah nilai dengan tipe T, sedangkan None mewakili ketiadaan nilai.

enum Option<T> {
    Some: T,
    None: (),
}

Enum Option berguna karena memungkinkan Anda untuk secara eksplisit mewakili kemungkinan dari sebuah nilai yang tidak ada, membuat kode Anda lebih ekspresif dan lebih mudah untuk dipahami. Menggunakan Option juga dapat membantu mencegah bug yang disebabkan oleh penggunaan nilai null yang tidak terinisialisasi atau tidak terduga.

Sebagai contoh, berikut adalah sebuah fungsi yang mengembalikan indeks dari elemen pertama dalam sebuah array dengan nilai tertentu, atau None jika elemen tersebut tidak ada.

Kami menunjukkan dua pendekatan untuk fungsi di atas:

  • Pendekatan Rekursif find_value_recursive
  • Pendekatan Iteratif find_value_iterative

Catatan: di masa depan akan lebih baik jika digantikan contoh yang lebih sederhana menggunakan perulangan dan tanpa kode terkait gas.

{{#include ../listings/ch06-enums-and-pattern-matching/no_listing_03_enum_option/src/lib.cairo}}

Menjalankan kode ini akan mencetak it worked.