Перейти к содержимому

If...else в Rust

if позволяет программе принимать решения — выполнить один блок кода или другой в зависимости от условия.

fn main() {
let age = 20;
if age >= 18 {
println!("Ты можешь голосовать");
}
}
▶ Попробуй сам

Обрати внимание на пару вещей — на них часто спотыкаются те, кто пришёл из других языков:

  • Скобки вокруг условия не нужны: if age >= 18, а не if (age >= 18).
  • Условие должно быть настоящим bool. if age (число) не скомпилируется — нужно написать if age != 0 или что-то похожее.
fn main() {
let age = 15;
if age >= 18 {
println!("Ты можешь голосовать");
} else {
println!("Пока рано");
}
}
▶ Попробуй сам
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 проверяет условия сверху вниз и выполняет первую подходящую ветку — ровно так, как ты и ожидаешь.

А вот чего нет во многих языках: в 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 не разрешает.

Сохрани число n = 7. С помощью if как выражения запиши в переменную kind строку "чётное" или "нечётное" и выведи 7 — нечётное. Подсказка: число чётное, когда n % 2 == 0.

Показать решение
fn main() {
let n = 7;
let kind = if n % 2 == 0 { "чётное" } else { "нечётное" };
println!("{n} — {kind}");
}

Вывод:

7 — нечётное
▶ Попробуй сам

Кинотеатр берёт 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}");
}

Вывод:

Билет: $7
▶ Попробуй сам
  • if условие { ... } — скобки не нужны, а условие должно быть типа bool.
  • Дополнительные проверки добавляются через else if, запасной вариант — через else.
  • Соединяй условия через && и || вместо того, чтобы вкладывать if в if.
  • if можно использовать как выражение, которое даёт значение: типы веток должны совпадать, и else обязателен.

Проверь себя

1. Что обязательно для условия if в Rust?

2. Что требуется от обеих веток, когда if используется как выражение в let?

Результат: 0 / 2