Выражения match
match можно использовать, чтобы проверить значение на соответствие одному или нескольким вариантам:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let val = 1;
match val {
1 => println!("one"),
10 => println!("ten"),
100 => println!("one hundred"),
_ => {
println!("something else");
}
}
}
Как и выражения if, match тоже может возвращать значение;
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let flag = true;
let val = match flag {
true => 1,
false => 0,
};
println!("The value of {flag} is {val}");
}
-
Ветви
matchпроверяются сверху вниз, и выполняется тело первой подходящей ветви. -
В отличие от
switchв других языках, здесь нет «проваливания» (fall-through) между ветвями. -
Телом ветки
matchможет быть одно выражение или блок. Технически это одно и то же, ведь блоки тоже являются выражениями, но на этом этапе студенты могут не до конца понять такую симметрию. -
Выражения
matchдолжны быть исчерпывающими: они должны покрывать все возможные значения или иметь ветку по умолчанию, например_. Исчерпывающность проще всего показать на перечислениях, но перечисления ещё не введены. Поэтому мы демонстрируем сопоставление сbool, как с самым простым примитивным типом. -
На этом слайде
matchвводится без разговора о сопоставлении с образцом, чтобы студенты успели освоиться с синтаксисом и не получили слишком много информации сразу. О сопоставлении с образцом подробнее поговорим завтра, поэтому здесь старайтесь не углубляться.
Для дальнейшего изучения
-
Чтобы лучше объяснить пользу
match, можно сравнить примеры с эквивалентами наif. Во втором случае, при сопоставлении сbool, блокif {} else {}очень похож. Но в первом примере, где проверяется несколько вариантов, выражениеmatchможет быть короче, чемif {} else if {} else if {} else. -
matchтакже поддерживает охранники (match guards), которые позволяют добавить произвольное логическое условие, определяющее, выполнять ли ветку. Однако разговор об охранниках требует объяснения сопоставления с образцом, а на этом слайде мы стараемся этого избежать.