Lompati ke konten utama
Modul 2 · Pelajaran 2 dari 24/14 dalam kursus~15 min
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:

Rust
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 bertipe T.
  • None : menunjukkan tidak adanya nilai.
Rust
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 keberhasilan T.
  • Err(E): operasi gagal dan mengandung kesalahan E.
Rust
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:

Rust
let some_u8 = 3u8;
match some_u8 {
    1 => println!("One"),
    2 => println!("Two"),
    _ => println!("Something else"), // Handles all other values
}

Cobalah sendiri

Latihan#rust.m2.l2.e1
Upaya: 0Memuat…

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'.

Memuat editor…
Tunjukkan petunjuk

Tulis blok `match might_value { Some(v) => println!('value is: {}', v), None => println!('no value') }`.

Solusi tersedia setelah 3 upaya

Latihan#rust.m2.l2.e2
Upaya: 0Memuat…

Selesaikan fungsi check_age sehingga ia mengembalikan Ok('Adult') jika usia lebih besar dari atau sama dengan 18, dan Err('Minor') sebaliknya.

Memuat editor…
Tunjukkan petunjuk

Gunakan `jika usia >= 18`untuk memutuskan apakah akan mengembalikan`Ok('Dewasa')`atau`Err('Minor')`.

Solusi tersedia setelah 3 upaya

Latihan#rust.m2.l2.e3
Upaya: 0Memuat…

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.

Memuat editor…
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