Memahami enum dan pencocokan pola merupakan hal mendasar dalam Rust. Jelajahi teknik yang efektif untuk menerapkan keduanya.
Rust menyediakan berbagai tipe data untuk melakukan operasi, mulai dari tipe data dasar seperti string, integer, dan floating angka titik untuk menggabungkan tipe data seperti vektor dan array ke tipe data komposit seperti struct dan enumerasi.
Enum (pencacahan) adalah tipe data yang memungkinkan representasi kumpulan nilai tetap, seperti hari dalam seminggu dan warna pelangi. Enum berguna ketika nilai yang mungkin untuk suatu variabel terbatas dan diketahui.
Mendefinisikan Enum di Rust
Mendeklarasikan enum di Rust mirip dengan mendeklarasikan enum di C#. Anda akan menggunakan enum kata kunci mengikuti nama dan satu set kurung kurawal untuk menentukan pencacahan. Anda dapat menentukan kemungkinan varian (entitas) di dalam kurung kurawal dengan koma sebagai pemisah.
Inilah enum untuk hari-hari dalam seminggu:
enumHari kerja {
Senin,
Selasa,
Rabu,
Kamis,
Jumat,
Sabtu,
Minggu,
}
Itu Hari kerja enum mewakili hari dalam seminggu. Itu varian adalah nama hari dan tidak memiliki nilai terkait. Selain itu, varian enum Anda bisa apa saja Tipe data karat.
Anda dapat mengakses varian dengan menentukan nama varian menggunakan operator pemisah jalur (::) pada enum.
membiarkan hari = Hari Kerja:: Senin;
// versi variabel `day` yang diketik secara statis
membiarkan hari: Hari kerja = Hari kerja: : Senin;
Kode menentukan bahwa Anda ingin mengakses Senin varian enum Hari Kerja.
Varian dan Diskriminan Enum
Varian enum dikaitkan dengan nilai bilangan bulat yang disebut diskriminatif. Secara default, nilai diskriminan dimulai dari nol dan bertambah 1 untuk varian berikutnya; namun, Anda dapat menentukan nilai diskriminan khusus untuk setiap varian.
Berikut adalah contoh enum Hari Kerja dengan varian yang ditetapkan nilai.
enumHari kerja {
Senin = 1,
Selasa = 2,
Rabu = 3,
Kamis = 4,
Jumat = 5,
Sabtu = 6,
Minggu = 7,
}
Enum Hari Kerja memiliki tujuh varian yang mewakili setiap hari dalam seminggu, dan setiap hari memiliki nilai (disebut diskriminan) yang ditetapkan untuknya. Variannya ada di urutan hari pertama hingga terakhir dalam seminggu.
Anda dapat mengakses nilai diskriminan menggunakan nama varian.
fnutama() {
cetak!("Senin: {}", Hari kerja:: Senin sebagaii32);
cetak!("Selasa: {}", Hari kerja:: Selasa sebagaii32);
cetak!("Rabu: {}", Hari kerja:: Rabu sebagaii32);
cetak!("Kamis: {}", Hari kerja:: Kamis sebagaii32);
cetak!("Jumat: {}", Hari kerja:: Jumat sebagaii32);
cetak!("Sabtu: {}", Hari kerja:: Sabtu sebagaii32);
cetak!("Minggu: {}", Hari kerja:: Minggu sebagaii32);
}
Itu cetak! makro digunakan untuk mencetak diskriminan. Setiap cetak! doa makro membutuhkan dua argumen: string format dan nilai. String format menentukan cara memformat output; nilainya adalah nilai aktual yang dicetak.
Dalam hal ini, string format adalah literal string yang berisi nama hari kerja, dan nilainya adalah varian enum dengan cast eksplisit ke i32 tipe bilangan bulat.
Pemeran eksplisit ke i32 diperlukan karena Rust enum direpresentasikan sebagai bilangan bulat, tetapi tipe bilangan bulat tertentu bergantung pada ukuran enum. Secara default, Rust menetapkan tipe bilangan bulat terkecil yang dapat mewakili semua diskriminan dalam enum. Namun dalam kasus ini, Anda ingin mencetak nilai sebagai bilangan bulat i32, jadi Anda harus mentransmisikannya secara eksplisit.
Inilah hasil dari menjalankan utama fungsi:
Pencocokan Pola dalam Karat
Pencocokan pola adalah konstruksi struktur kontrol Rust yang berguna untuk mengidentifikasi pola data. Pencocokan pola memungkinkan penulisan kode yang ringkas dan efisien saat beroperasi dengan struktur data tingkat lanjut atau melakukan operasi yang kompleks.
Anda akan menggunakan cocok kata kunci diikuti dengan => pemisah untuk pola dan operasi untuk pola, masing-masing. Polanya bisa berupa ekspresi Rust apa pun, termasuk literal, variabel, dan pemanggilan fungsi.
Berikut adalah contoh pernyataan kecocokan:
fnutama(){
membiarkan x = 5;
cocok X {
1 => cetak!("satu"),
2 => cetak!("dua"),
3 => cetak!("tiga"),
// berjalan jika tidak ada pola yang cocok
_ => cetak!("sesuatu yang lain"),
}
}
Itu utama pertandingan fungsi X terhadap beberapa pola kemudian mencetak nilai berdasarkan nilai x. Pola garis bawah (_) adalah pola kartu liar yang digunakan sebagai penampung semua kasus yang tidak ditangani secara eksplisit.
Enum dan Pencocokan Pola
Enum dan pencocokan pola berguna untuk mengekspresikan dan bekerja dengan struktur data tingkat lanjut dengan cara yang aman dan efisien. Anda dapat menggunakan enum untuk menentukan kumpulan nilai tetap dan pencocokan pola untuk bekerja dengan nilai tersebut.
Berikut enum untuk warna dalam pelangi:
enumPelangi {
Merah,
Oranye,
Kuning,
Hijau,
Biru,
Nila,
Ungu,
}
Setiap varian dari Pelangi enum mewakili warna pelangi. Anda dapat menggunakan pencocokan pola dengan pernyataan pencocokan untuk mencocokkan pola dengan varian untuk mengontrol alur program berdasarkan warna pelangi.
Inilah fungsi yang mengambil varian warna dari Rainbow enum dan mencetak pesan berdasarkan warna.
fnprint_color(warna: Pelangi) {
cocok warna {
Pelangi:: Merah => cetak!("Warnanya merah!"),
Pelangi:: Oranye => cetak!("Warnanya oranye!"),
Pelangi:: Kuning => cetak!("Warnanya kuning!"),
Pelangi:: Hijau => cetak!("Warnanya hijau!"),
Pelangi:: Biru => cetak!("Warnanya biru!"),
Pelangi:: Nila => cetak!("Warnanya nila!"),
Pelangi:: Ungu => cetak!("Warnanya ungu!"),
}
}
fnutama() {
membiarkan warna = Pelangi:: Biru;
print_color (warna);
}
Anda mungkin mendapatkan varian tidak pernah dibangun atau peringatan serupa ketika Anda akan mencoba mengeksekusi kode di atas karena varian lain selain varian Biru tidak pernah dibuat dalam kode ini. Jadi, dalam hal ini, Anda dapat dengan aman mengabaikan peringatan ini karena memang disengaja.
Itu print_color fungsi mengambil parameter warna dari tipe Rainbow enum. Pernyataan kecocokan cocok dengan warna dari rangkaian warna yang diakses melalui nama varian. Dan terakhir, pesan dicetak berdasarkan warna yang cocok.
Anda dapat menggunakan pencocokan pola untuk operasi kompleks seperti beberapa nilai kembalian berdasarkan kondisi.
fnmenghitung_panjang gelombang(warna: Pelangi) -> u32 {
cocok warna {
Pelangi:: Merah => 700,
Pelangi:: Oranye => 590,
Pelangi:: Kuning => 570,
Pelangi:: Hijau => 510,
Pelangi:: Biru => 475,
Pelangi:: Nila => 445,
Pelangi:: Ungu => 400,
}
}
Itu menghitung_panjang gelombang fungsi mengambil varian warna dari tipe Rainbow enum sebagai parameter dan mengembalikan bilangan bulat 32-bit yang tidak bertanda yang merupakan panjang gelombang warna yang cocok dengan pola.
Rust Juga Menyediakan Struktur untuk Membuat Jenis Kustom
Enum berguna untuk menentukan jenis kustom untuk beberapa operasi, terutama dalam kasus di mana bidang diketahui dan pasti.
Rust juga menyediakan struct yang dapat Anda gunakan untuk membuat tipe kustom dengan bidang bernama. Tidak seperti enum, struct memungkinkan Anda menentukan bidang dari berbagai jenis yang dapat Anda akses dan modifikasi satu per satu.