If...else в Rust
if позволяет программе принимать решения — выполнить один блок кода или другой в зависимости от условия.
Простой if
Заголовок раздела «Простой if»fn main() { let age = 20;
if age >= 18 { println!("Ты можешь голосовать"); }}Обрати внимание на пару вещей — на них часто спотыкаются те, кто пришёл из других языков:
- Скобки вокруг условия не нужны:
if age >= 18, а неif (age >= 18). - Условие должно быть настоящим
bool.if age(число) не скомпилируется — нужно написатьif age != 0или что-то похожее.
if / else
Заголовок раздела «if / else»fn main() { let age = 15;
if age >= 18 { println!("Ты можешь голосовать"); } else { println!("Пока рано"); }}else if для нескольких веток
Заголовок раздела «else if для нескольких веток»fn main() { let score = 72;
if score >= 90 { println!("Оценка: A"); } else if score >= 75 { println!("Оценка: B"); } else if score >= 60 { println!("Оценка: C"); } else { println!("Оценка: F"); }}Rust проверяет условия сверху вниз и выполняет первую подходящую ветку — ровно так, как ты и ожидаешь.
if как выражение
Заголовок раздела «if как выражение»А вот чего нет во многих языках: в Rust if может давать значение. Значит, его можно поставить справа от let:
fn main() { let age = 20; let status = if age >= 18 { "взрослый" } else { "несовершеннолетний" };
println!("{status}");}Это работает так же, как возврат значения из функции: после значения в каждой ветке нет точки с запятой. Одно требование: обе ветки должны давать один и тот же тип (здесь обе дают &str).
Объединяем условия вместо вложенности
Заголовок раздела «Объединяем условия вместо вложенности»if можно положить внутрь другого if. Это работает, но на втором-третьем уровне читать такой код уже тяжело. Часто условия проще соединить логическими операторами && (и) и || (или):
fn main() { let temperature = 22; let is_raining = false;
// Вложенно: работает, но уезжает вправо if temperature > 15 { if !is_raining { println!("Вложенно: пора на прогулку"); } }
// Та же проверка одним условием if temperature > 15 && !is_raining { println!("Одним условием: пора на прогулку"); }
// || истинно, если истинна хотя бы одна сторона if temperature < 0 || temperature > 35 { println!("Лучше остаться дома"); } else { println!("Погода отличная"); }}Вывод:
Вложенно: пора на прогулкуОдним условием: пора на прогулкуПогода отличнаяВложенность по-прежнему уместна, когда внутренний блок делает что-то ещё или у него есть свой else. Но если внешний if нужен только для того, чтобы охранять внутренний, && скажет то же самое проще. Чтобы проверить, что число попадает в диапазон, пиши temperature >= 15 && temperature <= 25. Запись 15 <= temperature <= 25 Rust не разрешает.
Практика
Заголовок раздела «Практика»1. Чётное или нечётное
Заголовок раздела «1. Чётное или нечётное»Сохрани число n = 7. С помощью if как выражения запиши в переменную kind строку "чётное" или "нечётное" и выведи 7 — нечётное. Подсказка: число чётное, когда n % 2 == 0.
Показать решение
fn main() { let n = 7; let kind = if n % 2 == 0 { "чётное" } else { "нечётное" }; println!("{n} — {kind}");}Вывод:
7 — нечётное2. Цена билета
Заголовок раздела «2. Цена билета»Кинотеатр берёт 5 долларов с детей младше 12 лет, 7 — с тех, кому 65 или больше, и 12 — со всех остальных. Сохрани age равный 70, вычисли price одним выражением if / else if / else и выведи Билет: $7. Подсказка: каждая ветка должна вернуть число, а после последней } всего if ставится точка с запятой.
Показать решение
fn main() { let age = 70;
let price = if age < 12 { 5 } else if age >= 65 { 7 } else { 12 };
println!("Билет: ${price}");}Вывод:
Билет: $7if условие { ... }— скобки не нужны, а условие должно быть типаbool.- Дополнительные проверки добавляются через
else if, запасной вариант — черезelse. - Соединяй условия через
&&и||вместо того, чтобы вкладыватьifвif. ifможно использовать как выражение, которое даёт значение: типы веток должны совпадать, иelseобязателен.
Проверь себя
Заголовок раздела «Проверь себя»Проверь себя
1. Что обязательно для условия if в Rust?
2. Что требуется от обеих веток, когда if используется как выражение в let?
Результат: 0 / 2
Что почитать
Заголовок раздела «Что почитать»- Выражения
if— книга «Язык программирования Rust»: официальный разборif,else ifи использованияifвlet(перевод на русский). - if/else — Rust на примерах: один пример, который можно запустить, — с ветками, которые дают значение (перевод на русский).
- If expressions — The Rust Reference (на английском): точные правила, когда нужны все подробности.
- Rust на Exercism (на английском): бесплатные упражнения с наставниками; первые из них активно используют
ifиelse.