if

Rustにおける if の扱いはさほど複雑ではありませんが、伝統的なシステムプログラミング言語のそれに比べて、 動的型付け言語でみられる if にずっと近いものになっています。そのニュアンスをしっかり理解できるよう、 さっそく説明していきましょう。

if は一般化されたコンセプト、「分岐(branch)」の特別な形式です。この名前は木の枝(branch)を由来とし: 取りうる複数のパスから、選択の決定を行うポイントを表します。

if の場合は、続く2つのパスから1つを選択します。

fn main() { let x = 5; if x == 5 { // println!("x is five!"); println!("x は 5 です!"); } }
let x = 5;

if x == 5 {
    println!("x は 5 です!");
}

仮に x を別の値へと変更すると、この行は表示されません。より正確に言うなら、 if のあとにくる式が true に評価された場合に、ブロックが実行されます。 false の場合、ブロックは実行されません。

false の場合にも何かをしたいなら、 else を使います:

fn main() { let x = 5; if x == 5 { // println!("x is five!"); println!("x は 5 です!"); } else { // println!("x is not five :("); println!("x は 5 ではありません :("); } }
let x = 5;

if x == 5 {
    println!("x は 5 です!");
} else {
    println!("x は 5 ではありません :(");
}

場合分けが複数あるときは、 else if を使います:

fn main() { let x = 5; if x == 5 { // println!("x is five!"); println!("x は 5 です!"); } else if x == 6 { // println!("x is six!"); println!("x は 6 です!"); } else { // println!("x is not five or six :("); println!("x は 5 でも 6 でもありません :("); } }
let x = 5;

if x == 5 {
    println!("x は 5 です!");
} else if x == 6 {
    println!("x は 6 です!");
} else {
    println!("x は 5 でも 6 でもありません :(");
}

全くもって普通ですね。しかし、次のような使い方もできるのです:

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 が式であるためです。その式の値は、選択された分岐中の最後の式の値となります。 else のない if では、その値は常に () となります。