Progrust Library.

// dictionary

if式.

if式は、条件がtrueなら直後のブロックを、falseならelseのブロックを実行する分岐です。条件には論理値型を書きます(0など数値を条件にはできません)。分岐が3つ以上あるときはelse ifで条件をつなげます1

Rustのifではなく式であり、実行されたブロックの値がif式全体の値になります1。そのため三項演算子(cond ? a : b)は存在せず、評価結果をそのまま変数の束縛に使えます。

fn main() {
    let temperature = 31;
    let advice = if temperature >= 30 {
        "猛暑です。水分補給を忘れずに"
    } else if temperature >= 20 {
        "過ごしやすい気温です"
    } else {
        "上着があると安心です"
    };
    println!("{advice}");
}
Playgroundで開く

値として使うときの規則

状況 規則
値を変数に束縛する すべての分岐が同じ型の値を返す必要があります(型が食い違うとE0308)
elseがない どのブロックも実行されない場合があるため、if式の値はユニット型()になります。()以外の値の束縛にはelseが必須です

if let式

条件の代わりにletとパターンを書くif letは、パターンがマッチしたときだけブロックを実行する構文です1Option型の中身を取り出すときの定番の書き方です。詳細はif let式を参照してください。

補足

elseなしで値を束縛できない(E0317)

elseのないif式の値はユニット型()なので、()以外の分岐の値を束縛しようとするとコンパイルエラーE0317になります2

fn main() {
    let stock = 5;
    let message = if stock > 0 {
        "在庫あり"
    }; // エラー: E0317(elseがないと値を束縛できない)
    println!("{message}");
}
let chains — 条件を&&で連結する

Rust 1.88(edition 2024限定)から、ifwhile式の条件でletパターンと論理式を論理演算子&&で連結できます3。「Someを取り出せて、かつ条件も満たすとき」のような分岐が1行で書けます。

fn main() {
    let point_balance: Option<u32> = Some(800);
    if let Some(points) = point_balance && points >= 500 {
        println!("{points}ポイントあるので500円引きクーポンと交換できます");
    }
}
Playgroundで開く

Footnotes

  1. The Rust Reference: if expressions 2 3

  2. E0317 - Error codes index

  3. Announcing Rust 1.88.0 | Rust Blog

この辞書が使われているページ

backlinks 4

  1. 辞書if let式
  2. 辞書match式
  3. 辞書return式
  4. 動かして学ぶRustプログラミング問題集 › 第3章 制御フロー