Операторы let else
В распространённом случае, когда нужно сопоставить шаблон и вернуться из функции, используйте let else. Ветка else должна «расходиться» (return, break или паника, но не выход за конец блока).
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn hex_or_die_trying(maybe_string: Option<String>) -> Result<u32, String> {
let s = if let Some(s) = maybe_string {
s
} else {
return Err(String::from("got None"));
};
let first_byte_char = if let Some(first) = s.chars().next() {
first
} else {
return Err(String::from("got empty string"));
};
let digit = if let Some(digit) = first_byte_char.to_digit(16) {
digit
} else {
return Err(String::from("not a hex digit"));
};
Ok(digit)
}
fn main() {
println!("result: {:?}", hex_or_die_trying(Some(String::from("foo"))));
}
The rewritten version is:
#![allow(unused)]
fn main() {
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn hex_or_die_trying(maybe_string: Option<String>) -> Result<u32, String> {
let Some(s) = maybe_string else {
return Err(String::from("got None"));
};
let Some(first_byte_char) = s.chars().next() else {
return Err(String::from("got empty string"));
};
let Some(digit) = first_byte_char.to_digit(16) else {
return Err(String::from("not a hex digit"));
};
Ok(digit)
}
}
Для дальнейшего изучения
- Такой поток управления с ранним возвратом типичен для кода обработки ошибок на Rust, где вы пытаетесь получить значение из
Resultи вернуть ошибку, еслиResultбылErr. - Если студенты спросят, можно также показать, как тот же код обработки ошибок выглядит с использованием
?.