if let

列挙型をマッチさせるとき、場合によってはmatchを使用すると不自然な書き方になってしまう場合があります。例えば...

#![allow(unused)] fn main() { // Make `optional` of type `Option<i32>` // `optional`という変数の型を`Option<i32>`に指定 let optional = Some(7); match optional { Some(i) => { println!("This is a really long string and `{:?}`", i); // ^ Needed 2 indentations just so we could destructure // `i` from the option. // ^ `i`をoption型からデストラクトするためだけに // インデントが一つ増えてしまっている。 }, _ => {}, // ^ Required because `match` is exhaustive. Doesn't it seem // like wasted space? // ^ `match`は全ての型に対して網羅的でなくてはならないので必要。 // 冗長に見えませんか? }; }

この場合はif letを用いたほうが美しく、失敗時の処理も柔軟に行うことができます。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

同じように、if letを列挙型の値にマッチさせるのに利用できます。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

if letを利用する別の利点は、パラメータ化されていない列挙型の値をマッチさせられることです。 これは、列挙型がPartialEqを実装もderiveもしていない場合でも同様です。 PartialEqがない場合には、if Foo::Bar == aはコンパイルできません。 列挙型のインスタンスは比較できませんが、if letを使えば動作します。

次の例をif letを利用して修正するのにチャレンジしてみましょう。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

参照

列挙型, オプション, RFC