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() и итераторами.
Проверьте себя
1. Когда удобнее использовать if let вместо match?
AВсегда
BКогда из всех вариантов важен только один образец, а остальное игнорируем
CКогда нужна исчерпывающность
DТолько для чисел
2. Что делает while let Some(x) = stack.pop()?
AВыполняется один раз
BПовторяет тело, пока pop() возвращает Some, и останавливается на None
CБесконечный цикл
DОшибка компиляции
3. Можно ли добавить else к if let?
AНет
BДа, блок else выполнится, если образец не совпал
CТолько к match
DТолько к while let
Поддержать проект