Введение. Блок кода (Code Block) и выражения#
Блок кода в Rust является фундаментальной синтаксической единицей. Он не просто группирует инструкции, но и сам по себе является выражением, возвращающим значение.
- Синтаксис: Ограничивается фигурными скобками
{ ... }. Внутри блока может содержаться набор инструкций, завершающихся точкой с запятой;. - Возвращаемое значение:
- Если последняя строка блока является выражением без точки с запятой в конце, её результат становится возвращаемым значением всего блока кода.
- Если последняя строка завершается точкой с запятой
;(или блок кода пуст), блок возвращает тип()(пустой кортеж / unit-тип).
Давайте изучим блоки кода, синтаксис if-else и сопоставления на интерактивных слайдах:
Условные конструкции и ветвление#
Базовое выражение if и else#
Конструкция if проверяет истинность условия и выполняет соответствующую ветку кода.
- Правила синтаксиса:
- Выражение условия не нужно оборачивать в круглые скобки
( ). Использование круглых скобок вокруг самого выражения условия (например,if (a > 5)) считается нарушением стиля. - Результат условного выражения строго обязан иметь тип
bool. Использование целых чисел (как в C/C++) приведет к ошибке компиляции.
- Выражение условия не нужно оборачивать в круглые скобки
// ОШИБКА КОМПИЛЯЦИИ: count имеет тип отличный от bool
if count { ... }
// КОРРЕКТНО: выражения возвращают bool
if count > 0 { ... }
if count != 0 { ... }Операторы сравнения и логические операторы#
Используются для формирования условных выражений:
>(больше),>=(больше либо равно)<(меньше),<=(меньше либо равно)==(равенство),!=(неравенство)&&(логическое И),||(логическое ИЛИ)
if как выражение (Assigning from if)#
В Rust if-else является выражением, а значит, может возвращать значение, которое можно присвоить переменной.
- Критическое правило типов: Все ветви конструкции
if-elseпри использовании в качестве выражения обязаны возвращать один и тот же тип данных. - В Rust нет классического тернарного оператора
? :. Вместо него используетсяif-else.
// Корректно: обе ветки возвращают i32
let y = if x > 100 { 2024 } else { 2025 };
// ОШИБКА КОМПИЛЯЦИИ (Несовпадение типов: i32 и &str):
let y = if x > 100 { 2024 } else { "2025" };
Если ветка else отсутствует, то выражение if обязано возвращать unit-тип (), так как если условие не выполнится, результатом по умолчанию будет ():
let u = if x > 100 { foo() }; // Допустимо, только если foo() возвращает ()
Конструкция if let и сопоставление с шаблоном#
Базовый if let#
Используется как лаконичная альтернатива match, когда нас интересует только один конкретный шаблон.
// Для Option
if let Some(x) = foo_opt() {
bar(x); // x доступен только внутри этого блока
} else {
// Выполняется, если результат None
}Цепочки if let (let-chains)#
Начиная с версии Rust 1.88, поддерживается синтаксис объединения нескольких let-шаблонов и логических условий через оператор && в одном выражении if.
// Сопоставление с шаблоном + дополнительное ограничение на переменную x
if let Some(x) = foo() && x > 100 {
todo!()
}
// Множественные сопоставления с шаблонами в одном условии
if let Some(x) = foo() && let Some(y) = bar() && x > y {
todo!()
}Проверь свои знания!#
Пройдите короткий интерактивный тест, чтобы закрепить понимание блоков кода и ветвлений в Rust.
История обновлений
- Добавил интерактивные слайды и тесты по ветвлениям и блокам кода.

