Конструкция match в Rust
Конструкция match выбирает одно значение
из некоторого ряда значений. Это альтернатива
множеству else if. Когда образец подошел,
выполняются команды только этой ветки. Провала
в следующую ветку нет: отдельная команда разрыва
не нужна, остальные образцы не проверяют.
Пусть у нас есть цепочка проверок:
let num = 1;
if num == 1 {
println!("variant 1");
} else if num == 2 {
println!("variant 2");
} else if num == 3 {
println!("variant 3");
} else {
println!("variant not supported");
}
Перепишем этот код через match. То, что
стоит после =>, можно и выполнить,
и записать в переменную как результат:
let num = 1;
match num {
1 => println!("variant 1"), // сработает это
2 => println!("variant 2"),
3 => println!("variant 3"),
_ => println!("variant not supported"),
}
Результат ветки можно присвоить в переменную.
Перебор обязан покрыть все возможные значения,
поэтому запасной образец _ ловит остальное:
let lang = "ru";
let res = match lang {
"ru" => "111",
"en" => "222",
"de" => "333",
_ => "unsupported language",
};
println!("{}", res); // выведет 111
Перебор обязан покрыть все возможные значения.
Если заранее не перечислить каждый случай,
добавляют заглушку _, которая ловит все
остальное.
Выберем сообщение по коду дня:
let day = 3;
match day {
1 => println!("mon"),
2 => println!("tue"),
3 => println!("wed"),
_ => println!("other"),
}
При значении вне списка сработает заглушка:
let day = 9;
match day {
1 => println!("mon"),
2 => println!("tue"),
_ => println!("other"),
}
Дано число:
let level = 2;
Сопоставьте level с 1, 2
и остальными и выведите "easy",
"mid" или "hard".
Дано число:
let code = 0;
Для 0 выведите "off", для 1
выведите "on", для прочих "?".
Скажите, что произойдет, если убрать ветку с заглушкой, а число может быть любым.
Переменная num может принимать значения
1, 2, 3 или 4.
Определите, в какую пору года попадает
значение этой переменной.