if
в Rust не сильно сложен и больше похож на if
в динамически типизированных
языках, чем на более традиционный из системных. Давайте поговорим о нём, чтобы
вы поняли некоторые его нюансы.
if
является одной из форм более общего понятия, именуемого ветвлением. Это
название произошло от ветвей деревьев: конечный результат зависит от того, какой
из нескольких вариантов будет выбран.
if
содержит одно условие, в зависимости от которого будет выполняться одна из
двух ветвей:
let x = 5; if x == 5 { println!("x равняется пяти!"); }
При изменении значения x
на какое-либо другое, эта строчка не будет выведена
на экран. Если подробнее, то когда условие будет иметь значение true
,
следующий после него блок кода выполнится. В противном случае — нет.
Бывает нужно что-то выполнить, если условие не выполнится (выражение будет иметь
значение false). В таком случае можно использовать else
:
let x = 5; if x == 5 { println!("x равняется пяти!"); } else { println!("x это не пять :("); }
Когда необходимо больше одного выбора, можно использовать else if
:
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
всегда
возвращает ()
в качестве значения.