let-else
🛈 stable since: 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.