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 istemal karne se pehle dono cases handle karne par majboor karta hai, isliye ek missing value kabhi bhi ghalti se aise istemal 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 wapas 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> likhein jo s ka pehla character wapas kare, ya None agar s empty ho. Use "rust" ke sath call karein aur result ko match karein, Some hone par character print karein, ya None hone par "empty".