🦀 Rust

Условия (if/else/switch) в Rust 1.75: подробное руководство

Условия в Rust: if, else и switch

Представь, что ты — робот, который выполняет команды. Обычно ты просто идёшь по программе шаг за шагом. Но что, если нужно принять решение? Например: «Если на улице дождь — возьми зонт, иначе — надень кепку». Именно для таких решений в программировании есть условные операторы. Они позволяют программе выбирать, что делать, в зависимости от данных.

Простое условие: if

Самый базовый оператор — if. Он проверяет, истинно ли условие (правда ли оно). Если да — выполняет код внутри фигурных скобок.

fn main() {
    let temperature = 30;
    if temperature > 25 {
        println!("Жарко! Идём купаться!");
    }
    println!("Программа завершена.");
}

Вывод: Жарко! Идём купаться! и Программа завершена.

Выбор из двух: if-else

Если нужно сделать что-то одно, когда условие верно, и другое — когда неверно, используй else.

fn main() {
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();
    let number: i32 = input.trim().parse().unwrap();

    if number > 0 {
        println!("Число положительное");
    } else {
        println!("Число отрицательное или ноль");
    }
}

Пример работы: вводим 5 → получаем Число положительное. Вводим -3 → Число отрицательное или ноль.

Много вариантов: else if

Когда вариантов больше двух, можно выстроить цепочку проверок.

fn main() {
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();
    let age: i32 = input.trim().parse().unwrap();

    if age < 7 {
        println!("Детский сад");
    } else if age < 18 {
        println!("Школа");
    } else if age < 65 {
        println!("Работа");
    } else {
        println!("Пенсия");
    }
}

Важно: Rust проверяет условия по порядку. Как только находит первое истинное — выполняет его блок и выходит из всей цепочки.

Выбор по значению: match (аналог switch)

В Rust нет привычного switch, но есть мощный match. Он идеально подходит, когда нужно сравнить одну переменную с разными конкретными значениями.

fn main() {
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();
    let day: i32 = input.trim().parse().unwrap();

    match day {
        1 => println!("Понедельник — начало недели"),
        2 => println!("Вторник"),
        3 => println!("Среда"),
        4 => println!("Четверг"),
        5 => println!("Пятница — почти выходные"),
        6 | 7 => println!("Выходной!"),
        _ => println!("Такого дня недели нет"),
    }
}

Символ _ — это «всё остальное». Он срабатывает, если ни одно из перечисленных значений не подошло.

Разбор задачи: «Что больше?»

Напишем программу, которая сравнивает два числа и говорит, какое больше.

fn main() {
    let mut input1 = String::new();
    let mut input2 = String::new();
    
    println!("Введите первое число:");
    std::io::stdin().read_line(&mut input1).unwrap();
    println!("Введите второе число:");
    std::io::stdin().read_line(&mut input2).unwrap();
    
    let a: i32 = input1.trim().parse().unwrap();
    let b: i32 = input2.trim().parse().unwrap();
    
    if a > b {
        println!("Первое число ({}) больше второго ({})", a, b);
    } else if b > a {
        println!("Второе число ({}) больше первого ({})", b, a);
    } else {
        println!("Числа равны");
    }
}

Разбор задачи: «Чётность числа»

Проверим, делится ли число на 2 без остатка. Для этого используем оператор % — остаток от деления.

fn main() {
    let mut input = String::new();
    println!("Введите число ракушек:");
    std::io::stdin().read_line(&mut input).unwrap();
    let shells: i32 = input.trim().parse().unwrap();
    
    if shells % 2 == 0 {
        println!("Число {} — чётное! Можно разложить парами.", shells);
    } else {
        println!("Число {} — нечётное. Одна ракушка останется без пары.", shells);
    }
}

Частые ошибки новичков

  • Забыть фигурные скобки. В Rust после условия обязательно нужны { }, даже если внутри всего одна строка.
  • Использовать = вместо ==. Одно равно — это присваивание, два — сравнение. Ошибка: if x = 5.
  • Путать порядок в else if. Rust проверяет сверху вниз. Если поставить общее условие раньше частного, частное никогда не сработает.
  • Забыть про _ в match. Если не указать вариант «всё остальное», компилятор выдаст ошибку — он требует, чтобы были обработаны все возможные значения.

Итоговый пример: «Парк аттракционов»

Представим, что мы пишем программу для кассира. Посетители делятся на три зоны: для детей (до 12 лет), для подростков (12–17) и для взрослых (от 18).

fn main() {
    let mut input = String::new();
    println!("Введите возраст посетителя:");
    std::io::stdin().read_line(&mut input).unwrap();
    let age: i32 = input.trim().parse().unwrap();
    
    if age < 0 {
        println!("Ошибка: возраст не может быть отрицательным!");
    } else if age < 12 {
        println!("Зона для детей: карусели и батуты");
    } else if age < 18 {
        println!("Зона для подростков: американские горки и автодром");
    } else {
        println!("Зона для взрослых: экстремальные аттракционы");
    }
    
    // Используем match для дополнительной проверки
    match age {
        0..=2 => println!("Специальное предложение: бесплатный вход для малышей!"),
        65..=120 => println!("Скидка для пенсионеров 50%"),
        _ => println!("Стандартный билет"),
    }
}

Как это работает:

  • Сначала программа спрашивает возраст.
  • Проверяет, не ввёл ли пользователь отрицательное число (защита от ошибки).
  • Распределяет по возрастным зонам с помощью if-else if-else.
  • Дополнительно проверяет особые случаи (младенцы и пенсионеры) с помощью match.

Условные операторы — это основа любого принятия решений в программе. Потренируйся на задачах выше, и ты быстро научишься управлять логикой своих программ!