if let による簡潔な制御フロー

Beginner

This tutorial is from open-source community. Access the source code

はじめに

if let による簡潔な制御フローへようこそ。この実験は、Rust Bookの一部です。LabEx で Rust のスキルを練習できます。

この実験では、if let構文の簡潔な制御フローを調べます。これにより、ifletを組み合わせて、より短く読みやすい方法で、1 つのパターンに一致する値を処理し、それ以外を無視することができます。

if let による簡潔な制御フロー

if let構文を使うと、ifletを組み合わせて、1 つのパターンに一致する値を処理し、それ以外を無視するための、より簡潔な方法ができます。リスト 6-6 のプログラムを見てみましょう。このプログラムは、config_max変数のOption<u8>値をマッチングしますが、値がSomeバリアントの場合にのみコードを実行したいと思っています。

let config_max = Some(3u8);
match config_max {
    Some(max) => println!("The maximum is configured to be {max}"),
    _ => (),
}

リスト 6-6:値がSomeの場合にのみコードを実行するmatch

値がSomeの場合、パターン内の変数maxに値をバインドすることで、Someバリアント内の値を表示します。None値には何もしたくありません。match式を満たすために、1 つのバリアントを処理した後に_ => ()を追加する必要がありますが、これは面倒なボイラープレートコードです。

代わりに、if letを使ってもっと短い方法で書くことができます。以下のコードは、リスト 6-6 のmatchと同じ動作をします。

let config_max = Some(3u8);
if let Some(max) = config_max {
    println!("The maximum is configured to be {max}");
}

if let構文は、等号で区切られたパターンと式を取ります。これはmatchと同じように動作します。式はmatchに渡され、パターンは最初のアームになります。この場合、パターンはSome(max)で、maxSome内の値にバインドされます。その後、if letブロックの本体では、対応するmatchアームでmaxを使ったのと同じ方法でmaxを使うことができます。値がパターンに一致しない場合、if letブロック内のコードは実行されません。

if letを使うと、入力が少なく、インデントが少なく、ボイラープレートコードが少なくなります。ただし、matchが強制する網羅的なチェックが失われます。matchif letの間で選ぶかどうかは、特定の状況で何をしているか、および網羅的なチェックを失うことに対して簡潔さを得ることが適切なトレードオフかどうかに依存します。

言い換えると、if letは、値が 1 つのパターンに一致したときにコードを実行し、その後他のすべての値を無視するmatchのシンタックスシュガーと考えることができます。

if letにはelseを含めることができます。elseに付随するコードブロックは、if letelseに等価なmatch式の_ケースに付随するコードブロックと同じです。リスト 6-4 のCoin列挙型の定義を思い出してください。QuarterバリアントにはUsState値も含まれていました。4 分の 1 硬貨以外の硬貨をすべてカウントしながら、4 分の 1 硬貨の状態も表示したい場合、match式を使ってこれを行うことができます。

let mut count = 0;
match coin {
    Coin::Quarter(state) => println!("State quarter from {:?}!", state),
    _ => count += 1,
}

または、if letelse式を使うこともできます。

let mut count = 0;
if let Coin::Quarter(state) = coin {
    println!("State quarter from {:?}!", state);
} else {
    count += 1;
}

プログラムにmatchを使って表現するのが面倒くさい論理がある場合、if letも Rust のツールボックスにあることを忘れないでください。

まとめ

おめでとうございます!あなたは if let による簡潔な制御フローの実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行うことができます。