// 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 { ... }という形をよく見かけます。
補足
Footnotes
-
The Rust Programming Language: Concise Control Flow with if let and let…else —
if letを、値が1つのパターンにマッチしたときだけコードを実行し他の値は無視するmatchの糖衣構文とみなせると説明し、matchが強制する網羅性チェックを失う代わりに簡潔に書けるとしています。elseブロックは、等価なmatch式における_アームの処理と同じであるとも述べています。 ↩ ↩2 ↩3 ↩4 -
The Rust Reference:
ifexpressions - if let patterns —letパターンが対象の値にマッチしない場合、直後のブロックはスキップされ、elseブロックがあればそちらが評価されると定義しています。 ↩
この辞書が使われているページ
backlinks 4