AnyCompiler

Option aur Result

Rust mein null hota hi nahi. Ek value jo absent ho sakti hai use Option<T> mein wrap kiya jaata hai, jo ya to Some(value) hoti hai ya None — aur compiler aapko andar ki value use karne se pehle dono cases handle karne par majboor karta hai, isliye ek missing value kabhi bhi galti se aise use nahi ho sakti jaise woh present ho.

fn find_first_even(numbers: &[i32]) -> Option<i32> {
    for &n in numbers {
        if n % 2 == 0 {
            return Some(n);
        }
    }
    None
}

fn main() {
    let numbers = vec![1, 3, 5, 4, 7];
    match find_first_even(&numbers) {
        Some(n) => println!("Found: {}", n),
        None => println!("No even number found"),
    }
}
Output
Found: 4

Recoverable errors ke liye Result

Result<T, E> ek aise operation ko represent karta hai jo fail ho sakta hai: success par Ok(value), failure par Err(error). Yahan throw ya catch karne ke liye koi exceptions nahi hain — jo function fail ho sakta hai woh bas ek Result return karta hai, aur match caller ko dono outcomes ko explicitly handle karne par majboor karta hai.

fn divide(a: f64, b: f64) -> Result<f64, String> {
    if b == 0.0 {
        Err(String::from("cannot divide by zero"))
    } else {
        Ok(a / b)
    }
}

fn main() {
    match divide(10.0, 2.0) {
        Ok(result) => println!("Result: {}", result),
        Err(e) => println!("Error: {}", e),
    }

    match divide(10.0, 0.0) {
        Ok(result) => println!("Result: {}", result),
        Err(e) => println!("Error: {}", e),
    }
}
Output
Result: 5
Error: cannot divide by zero

Aage: functions — parameters, return types, aur Rust ka expression-based syntax.

Practice Exercise

Ek function first_char(s: &str) -> Option<char> likho jo s ka pehla character return kare, ya None agar s empty ho. Use "rust" ke sath call karo aur result ko match karo, Some hone par character print karo, ya None hone par "empty".