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 式と異なるものにしている主な点です。以前は、不都合な少しの繰り返しと外側の let によって、これらのパターンを近似できました。
#![allow(unused)] fn main() { use std::str::FromStr; fn get_count_item(s: &str) -> (u64, &str) { let mut it = s.split(' '); let (count_str, item) = match (it.next(), it.next()) { (Some(count_str), Some(item)) => (count_str, item), _ => panic!("Can't segment count item pair: '{s}'"), }; let count = if let Ok(count) = u64::from_str(count_str) { count } else { panic!("Can't parse integer: '{count_str}'"); }; (count, item) } assert_eq!(get_count_item("3 chairs"), (3, "chairs")); }
関連項目:
option、match、if let、および let-else RFC。