Конструкция `if`

if в Rust не сильно сложен и больше похож на if в динамически типизированных языках, чем на более традиционный из системных. Давайте поговорим о нём, чтобы вы поняли некоторые его нюансы.

if является одной из форм более общего понятия, именуемого ветвлением. Это название произошло от ветвей деревьев: конечный результат зависит от того, какой из нескольких вариантов будет выбран.

if содержит одно условие, в зависимости от которого будет выполняться одна из двух ветвей:

fn main() { let x = 5; if x == 5 { println!("x равняется пяти!"); } }
let x = 5;

if x == 5 {
    println!("x равняется пяти!");
}

При изменении значения x на какое-либо другое, эта строчка не будет выведена на экран. Если подробнее, то когда условие будет иметь значение true, следующий после него блок кода выполнится. В противном случае — нет.

Бывает нужно что-то выполнить, если условие не выполнится (выражение будет иметь значение false). В таком случае можно использовать else:

fn main() { let x = 5; if x == 5 { println!("x равняется пяти!"); } else { println!("x это не пять :("); } }
let x = 5;

if x == 5 {
    println!("x равняется пяти!");
} else {
    println!("x это не пять :(");
}

Когда необходимо больше одного выбора, можно использовать else if:

fn main() { let x = 5; if x == 5 { println!("x равняется пяти!"); } else if x == 6 { println!("x это шесть!"); } else { println!("x это ни пять, ни шесть :("); } }
let x = 5;

if x == 5 {
    println!("x равняется пяти!");
} else if x == 6 {
    println!("x это шесть!");
} else {
    println!("x это ни пять, ни шесть :(");
}

Всё это довольно прозаично. Однако, вы также можете сделать такую штуку:

fn main() { let x = 5; let y = if x == 5 { 10 } else { 15 }; // y: i32 }
let x = 5;

let y = if x == 5 {
    10
} else {
    15
}; // y: i32

Которую мы можем (и должны) записать примерно следующим образом:

fn main() { let x = 5; let y = if x == 5 { 10 } else { 15 }; // y: i32 }
let x = 5;

let y = if x == 5 { 10 } else { 15 }; // y: i32

Это работает, потому что if является выражением. Его значением является значение последнего выражения из выбранной ветви. if без else всегда возвращает () в качестве значения.