Progrust Library.

// dictionary

if let式.

if let式は、match式で1つのパターンだけを処理し残りは無視したい場合に使う糖衣構文とみなせます1。パターンが一致したときだけブロックを実行し、一致しない場合の処理はelseに書けます。matchのように列挙型が取りうる値をすべて網羅する必要はなく、その分簡潔に書けますが、網羅性チェックは働きません。

enum Coupon {
    NotIssued,
    Discount(i32), // 割引額(円)
}

fn describe(coupon: Coupon) {
    if let Coupon::Discount(amount) = coupon {
        println!("{amount}円引きのクーポンです");
    } else {
        println!("クーポンはありません");
    }
}

fn main() {
    describe(Coupon::Discount(300));
    describe(Coupon::NotIssued);
}
Playgroundで開く

等価なmatch式

上記の例は、以下のmatch式と同じ意味です。「1つのパターンにマッチしたときだけ処理し、それ以外は無視する」という書き方を短く表現したものと考えられます1

match式で書いた場合
enum Coupon {
    NotIssued,
    Discount(i32),
}

fn describe(coupon: Coupon) {
    match coupon {
        Coupon::Discount(amount) => println!("{amount}円引きのクーポンです"),
        _ => println!("クーポンはありません"),
    }
}

fn main() {
    describe(Coupon::Discount(300));
    describe(Coupon::NotIssued);
}
Playgroundで開く

elseとの組み合わせ

elseは、等価なmatch式における包括パターン_のアーム)と同じ役割です1。省略した場合は、パターンに一致しないときは何もせずif let式全体がユニット型()の値になります2。実務ではOption型Someから値を取り出す用途で使うことが最も多く、if let Some(値) = option { ... }という形をよく見かけます。

補足

if letとlet chains

if letの条件は論理演算子&&論理値型と連結できます(let chains)。バージョン・edition要件などの詳細はif式を参照してください。

Footnotes

  1. The Rust Programming Language: Concise Control Flow with if let and let…elseif letを、値が1つのパターンにマッチしたときだけコードを実行し他の値は無視するmatchの糖衣構文とみなせると説明し、matchが強制する網羅性チェックを失う代わりに簡潔に書けるとしています。elseブロックは、等価なmatch式における_アームの処理と同じであるとも述べています。 2 3 4

  2. The Rust Reference: if expressions - if let patternsletパターンが対象の値にマッチしない場合、直後のブロックはスキップされ、elseブロックがあればそちらが評価されると定義しています。

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

backlinks 4

  1. 辞書if式
  2. 辞書let-else文
  3. 辞書unwrap
  4. 動かして学ぶRustプログラミング問題集 › 第12章 OptionとResult