Module 4 • Lesson 22

if let and while let

📚 7 min read💻 Free Course🦀 nixus.pro

if let and while let

fn main() {
    // if let: single-pattern match, cleaner than full match
    let favorite = Some("Rust");

    // Verbose:
    match favorite { Some(lang) => println!("{}", lang), None => {} }

    // Clean:
    if let Some(lang) = favorite {
        println!("Favorite: {}", lang);
    }

    // if let ... else
    let config: Option = None;
    let port = if let Some(p) = config { p } else { 8080 };
    println!("Port: {}", port);

    // Matching enum variants
    #[derive(Debug)]
    enum Status { Ok, Error(String), Loading }
    let s = Status::Error("timeout".to_string());
    if let Status::Error(msg) = &s {
        println!("Error: {}", msg);
    }

    // while let: loop until pattern fails
    let mut numbers = vec![1, 2, 3, 4, 5];
    while let Some(n) = numbers.pop() { print!("{} ", n); }
    println!();

    // let-else (Rust 1.65+): bind or diverge
    fn process(s: &str) -> Option {
        let Ok(n) = s.parse::() else { return None; };
        Some(n * 2)
    }
    println!("{:?} {:?}", process("21"), process("bad"));
}

🎯 Practice

  1. Use if let to safely access the first element of a Vec and print it doubled, or "empty"
  2. Use while let to process a queue: repeatedly call .remove(0) until empty
  3. Use let-else to parse "name:age" input, returning early if format is wrong

🎉 Key Takeaways