Подробно о match
Шаблоны и охранные условия
«Подробно о match» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Выражение match
match сравнивает значение с последовательностью образцов и выполняет ветвь первого совпадения. Это выражение, поэтому оно возвращает значение.
fn main() {
let n = 3;
let label = match n {
1 => "one",
2 => "two",
3 => "three",
_ => "many",
};
println!("{label}");
}Полнота сопоставления
match должен охватывать каждое возможное значение. Шаблон _ перехватывает всё, что не совпало с предыдущими ветвями, обеспечивая полноту сопоставления.
fn main() {
let x = 42;
match x {
0 => println!("zero"),
_ => println!("nonzero"),
}
}Сопоставление нескольких значений
Используйте |, чтобы сопоставить несколько образцов в одной ветви.
fn main() {
let c = 'e';
match c {
'a' | 'e' | 'i' | 'o' | 'u' => println!("vowel"),
_ => println!("consonant"),
}
}Образцы-диапазоны
Сопоставляйте диапазон значений с помощью ..= (включительно). Это удобно для группировки чисел или символов.
fn main() {
let score = 85;
let grade = match score {
90..=100 => 'A',
80..=89 => 'B',
70..=79 => 'C',
_ => 'F',
};
println!("Grade: {grade}");
}Условия-ограничители в match
Условие-ограничитель — это дополнительное условие if для ветви. Ветвь срабатывает, только если подходит образец и условие-ограничитель истинно.
fn main() {
let pair = (2, -2);
match pair {
(x, y) if x + y == 0 => println!("sum is zero"),
(x, _) if x % 2 == 0 => println!("first is even"),
_ => println!("no rule"),
}
}Привязка в образцах
Образцы могут связывать сопоставленные части со переменными, чтобы использовать их в теле ветви.
fn main() {
let msg = Some(7);
match msg {
Some(n) => println!("got {n}"),
None => println!("nothing"),
}
}Сопоставление перечислений
match особенно хорошо подходит для перечислений, в частности когда варианты содержат данные.
enum Shape {
Circle(f64),
Rectangle(f64, f64),
}
fn area(s: Shape) -> f64 {
match s {
Shape::Circle(r) => 3.14159 * r * r,
Shape::Rectangle(w, h) => w * h,
}
}
fn main() {
println!("{}", area(Shape::Rectangle(3.0, 4.0)));
}Игнорирование с помощью _ и ..
Используйте _, чтобы проигнорировать одно значение, а .. — чтобы проигнорировать остальные элементы кортежа или структуры.
fn main() {
let triple = (1, 2, 3);
match triple {
(first, ..) => println!("first is {first}"),
}
}Возврат из match
Поскольку match является выражением, его результат можно присвоить переменной или сразу вернуть. Каждая ветвь должна выдавать один и тот же тип.
fn describe(n: i32) -> &'static str {
match n.cmp(&0) {
std::cmp::Ordering::Less => "negative",
std::cmp::Ordering::Equal => "zero",
std::cmp::Ordering::Greater => "positive",
}
}
fn main() {
println!("{}", describe(-5));
}Порядок ветвей имеет значение
Ветви проверяются сверху вниз; срабатывает первая подходящая. Размещайте конкретные образцы перед общими, а шаблон-заменитель — последним.
Привязка диапазонов с помощью @
Объедините диапазон с оператором @, чтобы проверить значение и сохранить его точное содержимое в той же ветви.
fn main() {
let n = 42;
match n {
small @ 0..=9 => println!("single digit: {small}"),
big @ 10..=99 => println!("two digits: {big}"),
_ => println!("large"),
}
}Быстрая проверка
Для чего нужно условие-ограничитель в (x, y) if x > y?
Повторение
Вы подробно изучили match:
- Это полное выражение, возвращающее значение
|сопоставляет несколько образцов, а..=— диапазоны- Условия-ограничители добавляют дополнительные условия
if - Образцы связывают данные, а
_и..игнорируют части значения - Порядок ветвей имеет значение — побеждает первое совпадение
Часто задаваемые вопросы
Урок «Подробно о 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 структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Подробно о match»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Подробно о match
- if let и while let
- Связывание с помощью @
- Деструктуризация