Hlavní navigace

Názor k článku Datový typ Option v programovacím jazyku Rust od Pavel Tišnovský - Jde o to, že pattern matching je možné...

  • Článek je starý, nové názory již nelze přidávat.
  • 23. 2. 2017 9:56

    Pavel Tišnovský

    Jde o to, že pattern matching je možné použít i v normálním let, jenže v tomto případě si Rust hlídá, jestli jsou pokryty všechny možné varianty, což je dobře (tím se vyloučí naše javovské oblíbené NPE :-). Takže tento kód nelze přeložit, protože není pokryta varianta s None, jen se Some:

    fn div(x: i32, y: i32) -> Option<i32> {
        if y != 0 {
            Some(x/y)
        }
        else {
            None
        }
    }
    
    fn main() {
        let Some(val) = div(2,1);
        println!("{}", val);
    }

    Chybová hláška je celkem srozumitelná, ale už z ní není jasné, co použít:

    error[E0005]: refutable pattern in local binding: `None` not covered

    Řešením je právě if let, které si to ohlídá - v použití ve formě příkazu lze "else" vynechat, při použití jako výraz už ne:

    fn div_message(x: i32, y :i32) -> String {
        let result = div(x, y);
    
        if let Some(val) = result {
            format!("{} / {} = {}", x, y, val)
        }
    }
    
    error[E0308]: if may be missing an else clause