Vlákno názorů k článku Datový typ Option v programovacím jazyku Rust od peci1 - "if let" je pro me na prvni pohled...

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

    peci1
    Stříbrný podporovatel

    "if let" je pro me na prvni pohled celkem tezko pochopitelna konstrukce... vztahuje se ciste jen k Option a praci s nim, nebo ma vseobecnejsi pouziti?

    Mozna me tam mate (pokud tomu spravne rozumim) ten implicitni pattern matching v prirazeni "Some(val) = result", coz je vec, ktera by v C-like jazycich nemohla existovat...

  • 23. 2. 2017 9:56

    Pavel Tišnovský
    Zlatý podporovatel

    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