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

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

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

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


# #![allow(unused_variables)]
#fn main() {
let x = 5;

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

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

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


# #![allow(unused_variables)]
#fn main() {
let x = 5;

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

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


# #![allow(unused_variables)]
#fn main() {
let x = 5;

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

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


# #![allow(unused_variables)]
#fn main() {
let x = 5;

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

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


# #![allow(unused_variables)]
#fn main() {
let x = 5;

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

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