"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...
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