Защитные условия и привязки в 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 — локальная установка не требуется.
Все уроки этого курса
- Создание первого перечисления
- Сопоставление вариантов перечисления
- Перечисления с данными
- Защитные условия и привязки в match