Pelajaran modul (2/2)
Pencocokan Pola, Pilihan, dan Hasil
Rust memiliki mekanisme aliran kontrol yang sangat kuat yang disebut pencocokan pola. Ini memungkinkan Anda membandingkan nilai dengan serangkaian pola dan mengeksekusi kode berdasarkan pola yang cocok.
Pernyataan match
Pernyataan match di Rust mirip dengan switch dalam bahasa lain, tetapi jauh lebih kuat dan aman. Kompiler memastikan bahwa kecocokannya lengkap, yang berarti semua kemungkinan kasus harus ditangani:
enum Direction {
North,
South,
East,
West,
}
let dir = Direction::East;
match dir {
Direction::North => println!("Andiamo a Nord"),
Direction::South => println!("Andiamo a Sud"),
Direction::East => println!("Andiamo a Est"),
Direction::West => println!("Andiamo a Ovest"),
}Menangani Ketiadaan Nilai: Option
Rust tidak memiliki konsep nilai null (null atau nil). Sebaliknya, perpustakaan standar mendefinisikan enum bernama Option<T> yang dapat berisi:
Some(T): berisi nilai bertipeT.None: menunjukkan tidak adanya nilai.
let x: Option<i32> = Some(5);
let y: Option<i32> = None;
match x {
Some(val) => println!("C'e un valore: {}", val),
None => println!("Nessun valore trovato"),
}Menangani Kesalahan yang Dapat Dipulihkan: Result
Untuk operasi yang bisa gagal (seperti membaca file atau menguraikan string menjadi angka), Rust menggunakan enum Result<T, E>, yang memiliki dua varian:
Ok(T): operasi berhasil dan berisi nilai keberhasilanT.Err(E): operasi gagal dan mengandung kesalahanE.
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
if denominator == 0.0 {
Err(String::from("Divisione per zero!"))
} else {
Ok(numerator / denominator)
}
}Berkat kompiler Rust, Anda terpaksa menangani kasus Err sebelum Anda dapat mengakses nilai di dalam Ok, sehingga mencegah banyak bug runtime yang umum.
Pola Wildcard _
Saat bekerja dengan tipe data yang memiliki banyak varian (seperti bilangan bulat), tidak mungkin membuat daftar semua kasus dalam match. Rust memungkinkan penggunaan karakter wildcard _ untuk menangkap semua kasus tersisa yang tidak ditentukan secara eksplisit:
let some_u8 = 3u8;
match some_u8 {
1 => println!("One"),
2 => println!("Two"),
_ => println!("Something else"), // Handles all other values
}Cobalah sendiri
Deklarasikan variabel bernama might_value bertipe Option<i32> yang berisi Some(42). Gunakan pernyataan kecocokan pada might_value: jika berisi Some(v) print 'value is: v' (menggunakan println!), jika berisi None print 'no value'.
Tunjukkan petunjuk
Tulis blok `match might_value { Some(v) => println!('value is: {}', v), None => println!('no value') }`.
Solusi tersedia setelah 3 upaya
Selesaikan fungsi check_age sehingga ia mengembalikan Ok('Adult') jika usia lebih besar dari atau sama dengan 18, dan Err('Minor') sebaliknya.
Tunjukkan petunjuk
Gunakan `jika usia >= 18`untuk memutuskan apakah akan mengembalikan`Ok('Dewasa')`atau`Err('Minor')`.
Solusi tersedia setelah 3 upaya
Deklarasikan enum bernama Status yang berisi varian Aktif dan Tidak Aktif. Secara utama, deklarasikan variabel status_saat ini dengan nilai Status::Aktif. Terakhir, gunakan pernyataan kecocokan pada status_saat ini untuk mencetak 'aktif' jika statusnya Aktif, atau 'tidak aktif' jika statusnya Tidak Aktif.
Tunjukkan petunjuk
Tentukan enum sebelum main dengan `enum Status { Aktif, Tidak Aktif }`. Secara utama, gunakan `let current_status = Status::Active;`dan lakukan `match` pada variannya.
Solusi tersedia setelah 3 upaya