let-else
🛈 Rust 1.65で安定化。
🛈 エディションを指定するには
rustc --edition=2021 main.rs
のようにします。
let
-else
を使うと反駁できるパターンにマッチさせつつ、通常のlet
のように変数束縛することができます。マッチしなかった場合は(break
、return
、panic!
のように)処理を分岐させます。
use std::str::FromStr;
fn get_count_item(s: &str) -> (u64, &str) {
let mut it = s.split(' ');
let (Some(count_str), Some(item)) = (it.next(), it.next()) else {
panic!("Can't segment count item pair: '{s}'");
};
let Ok(count) = u64::from_str(count_str) else {
panic!("Can't parse integer: '{count_str}'");
};
(count, item)
}
fn main() {
assert_eq!(get_count_item("3 chairs"), (3, "chairs"));
}
束縛した変数名のスコープがmatch
やif let
-else
式との主な違いです。match
やif let
-else
でも似たようなことができますが、残念ながらコードの繰り返しや追加のlet
が必要になってしまいます。