0Pricing
Learn Rust Coding · Урок

Защитные условия и привязки в match

Добавляйте условия и извлекайте значения.

«Защитные условия и привязки в match» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

Что такое условие сопоставления

Условие сопоставления — это дополнительное условие if, добавленное к ветви match. Ветвь срабатывает только тогда, когда шаблон совпал и условие истинно.

Это позволяет разделить один вариант на более точные случаи в зависимости от его данных.

match number {
    Some(n) if n > 0 => println!("positive"),
    Some(n) => println!("zero or negative"),
    None => println!("no number"),
}

Синтаксис условия

Запишите шаблон, затем if condition, а после него =>. В условии можно использовать любые переменные, связанные шаблоном.

Если условие ложно, Rust переходит к следующей ветви.

fn main() {
    let n = 4;
    match n {
        x if x % 2 == 0 => println!("even"),
        _ => println!("odd"),
    }
}

Условия с данными перечисления

Условия особенно полезны с перечислениями, содержащими данные. Свяжите внутреннее значение с именем, а затем проверьте его.

Здесь положительный и отрицательный баланс получают разные сообщения, хотя оба относятся к одному и тому же варианту.

enum Account {
    Balance(i32),
    Closed,
}

fn main() {
    let a = Account::Balance(-5);
    match a {
        Account::Balance(b) if b < 0 => println!("overdrawn"),
        Account::Balance(b) => println!("balance {}", b),
        Account::Closed => println!("closed"),
    }
}

Порядок по-прежнему имеет значение

Поскольку ветви проверяются сверху вниз, поместите более конкретную ветвь с условием перед общей.

Если бы обычная ветвь Balance(b) стояла первой, она совпала бы со всеми значениями, и ветвь с условием никогда бы не сработала.

Сопоставление с литеральными значениями

Можно также сопоставлять шаблон непосредственно с конкретными литералами без условия.

Здесь значения 0 и 1 сопоставляются точно, а _ обрабатывает остальные.

fn main() {
    let n = 1;
    match n {
        0 => println!("zero"),
        1 => println!("one"),
        _ => println!("many"),
    }
}

Сопоставление с диапазонами

Шаблоны могут сопоставляться с диапазоном значений с помощью ..=, который включает обе границы.

Это удобная альтернатива нескольким условиям сравнения.

fn main() {
    let score = 85;
    match score {
        0..=59 => println!("fail"),
        60..=100 => println!("pass"),
        _ => println!("out of range"),
    }
}

Связывание с оператором @

Оператор @ позволяет одновременно проверить значение по шаблону и связать его с именем.

Здесь id @ 1..=5 проверяет диапазон и сохраняет фактическое значение в id, чтобы его можно было вывести.

fn main() {
    let n = 3;
    match n {
        id @ 1..=5 => println!("small id {}", id),
        other => println!("other {}", other),
    }
}

Связывание всего значения

Простое имя в шаблоне, например other выше, связывает всё значение целиком. Оно действует как универсальный шаблон, которым всё ещё можно пользоваться.

Используйте _, когда хотите проигнорировать значение, и имя, когда оно Вам нужно.

fn main() {
    let n = 99;
    match n {
        0 => println!("zero"),
        value => println!("got {}", value),
    }
}

Совместное использование условий и связывания

Для точного управления можно объединить связывание с условием: связать данные, а затем добавить условие.

Эта программа особо отмечает большие чётные балансы.

enum Account {
    Balance(i32),
}

fn main() {
    let a = Account::Balance(200);
    match a {
        Account::Balance(b) if b > 100 && b % 2 == 0 => println!("big even {}", b),
        Account::Balance(b) => println!("normal {}", b),
    }
}

Условия для нескольких шаблонов

Условие применяется ко всей ветви, даже если в ней объединены шаблоны с помощью |.

Условие проверяется после совпадения с любым из перечисленных шаблонов.

fn main() {
    let n = 6;
    match n {
        2 | 4 | 6 if n > 3 => println!("big even"),
        _ => println!("other"),
    }
}

Объединяем всё вместе

Эта итоговая программа объединяет варианты с данными, связывание, условие и универсальный шаблон, чтобы классифицировать показание температуры.

Измените значение и снова запустите программу, чтобы увидеть срабатывание разных ветвей.

enum Reading {
    Temp(i32),
    Missing,
}

fn main() {
    let r = Reading::Temp(38);
    match r {
        Reading::Temp(t) if t >= 38 => println!("fever: {}", t),
        Reading::Temp(t) => println!("normal: {}", t),
        Reading::Missing => println!("no reading"),
    }
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли условия и связывание.

Итоги

Вы научились уточнять сопоставление с помощью условий (pattern if condition), сопоставлять литералы и диапазоны (..=), а также создавать связи с помощью имён или оператора @.

Теперь, объединив это со всем изученным ранее, Вы можете описывать фиксированные наборы состояний, присоединять к ним данные и точно реагировать на каждый случай. Отличная работа с перечислениями и match!

Часто задаваемые вопросы

Урок «Защитные условия и привязки в match» бесплатный?

Да — полный текст урока «Защитные условия и привязки в match» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Защитные условия и привязки в match»?

Добавляйте условия и извлекайте значения. Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Защитные условия и привязки в match»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание первого перечисления
  2. Сопоставление вариантов перечисления
  3. Перечисления с данными
  4. Защитные условия и привязки в match
← Назад к Learn Rust Coding