if let и while let
if let и while let — компактный способ обработать один интересующий образец без полного match.
if let — короткая форма для случая, когда из всех образцов важен только один, а остальное можно игнорировать.
Когда match избыточен
Иногда из всего match вас интересует один вариант, а остальные обрабатываются одинаково или вообще никак. Полный match с веткой _ => () выглядит громоздко:
fn main() {
let config = Some(5);
// многословно ради одного случая
match config {
Some(v) => println!("значение: {v}"),
None => {} // ничего
}
}Вывод:
значение: 5
То же самое короче через if let: «если значение совпадает с этим образцом — выполни блок».
fn main() {
let config = Some(5);
if let Some(v) = config {
println!("значение: {v}");
}
}Вывод:
значение: 5
if let с else
К if let можно добавить else — он сработает, если образец не совпал. Это удобная развилка «есть значение / нет значения».
fn main() {
let result: Option<i32> = None;
if let Some(v) = result {
println!("получили {v}");
} else {
println!("значения нет");
}
}Вывод:
значения нет
while let — цикл, пока образец совпадает
Аналогично while let повторяет тело, пока выражение совпадает с образцом. Классический пример — выгребать элементы из вектора через pop(), который возвращает Option: Some, пока есть элементы, и None, когда вектор опустел.
fn main() {
let mut stack = vec![1, 2, 3];
while let Some(top) = stack.pop() {
println!("сняли {top}");
}
println!("стек пуст");
}Вывод:
сняли 3 сняли 2 сняли 1 стек пуст
Цикл сам останавливается, когда pop() вернёт None — не нужно вручную проверять длину.
Что выбрать
| Конструкция | Когда |
match | нужно обработать несколько вариантов (и важна исчерпывающность) |
if let | интересен один образец, остальное игнорируем |
while let | повторять, пока выражение совпадает с образцом |
Итог
if letзаменяетmatch, когда важен лишь один образец.- С
elseполучается развилка «совпало / не совпало». while letкрутит цикл, пока образец совпадает — удобно сpop()и итераторами.