Result & Option — Rust

Result & Option di Rust Rust tidak punya null atau exception. Sebagai gantinya, Rust menggunakan dua enum bawaan: Option dan Result untuk menangani ketiadaan ni

Result & Option di Rust

Rust tidak punya null atau exception. Sebagai gantinya, Rust menggunakan dua enum bawaan: Option<T> dan Result<T, E> untuk menangani ketiadaan nilai dan error.

Option<T> — Mungkin Ada, Mungkin Tidak

// Option<T> = Some(T) | None
fn cari_index(v: &[i32], target: i32) -> Option<usize> {
    for (i, &item) in v.iter().enumerate() {
        if item == target {
            return Some(i);
        }
    }
    None
}

fn main() {
    let angka = vec![10, 20, 30, 40];

    match cari_index(&angka, 30) {
        Some(i) => println!("Ditemukan di index {}", i),
        None => println!("Tidak ditemukan"),
    }
}

Method Option yang Berguna

let x: Option<i32> = Some(42);
let y: Option<i32> = None;

// unwrap — ambil nilai, panic jika None
println!("{}", x.unwrap());      // 42
// println!("{}", y.unwrap());   // PANIC!

// unwrap_or — default value jika None
println!("{}", y.unwrap_or(0));  // 0

// is_some / is_none
println!("{}", x.is_some());  // true
println!("{}", y.is_none());  // true

// map — transformasi nilai di dalam Some
let doubled = x.map(|v| v * 2);  // Some(84)

Result<T, E> — Sukses atau Error

use std::num::ParseIntError;

fn parse_angka(s: &str) -> Result<i32, ParseIntError> {
    s.parse::<i32>()
}

fn main() {
    match parse_angka("42") {
        Ok(n) => println!("Berhasil: {}", n),
        Err(e) => println!("Error: {}", e),
    }

    match parse_angka("abc") {
        Ok(n) => println!("Berhasil: {}", n),
        Err(e) => println!("Error: {}", e),
    }
}

if let — Pattern Matching Ringkas

let nilai: Option<i32> = Some(42);

// Daripada match penuh:
if let Some(n) = nilai {
    println!("Nilainya: {}", n);
}

// Untuk Result:
if let Ok(angka) = "123".parse::<i32>() {
    println!("Parsed: {}", angka);
}

Yang akan kamu pelajari