Rust には、他の言語とは異なる制御フロー構造がいくつかあります。これらはパターン マッチングに使用されます。
if let
式
let else
式
while let
式
if let
式 を使用すると、値がパターンに一致するかどうかに応じて異なるコードを実行できます。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
パターンをマッチして関数から戻るという一般的なケースでは、let else
を使用します。「else」ケースは発散する必要があります(return
、break
、パニックなど、ブロックから抜けるもの以外のすべて)。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
if let
に似た while let
派生物もあります。これは、パターンに照らして値をテストします。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ここで String::pop
は、文字列が空になるまで Some(c)
を返し、その後 None
を返します。while let
を使用すると、すべてのアイテムに対して反復処理を続行できます。
Speaker Notes
This slide should take about 10 minutes.
match
とは異なり、if let
ではすべての分岐を網羅する必要はないため、match
よりも簡潔になります。
- 一般的な使用方法は、
Option
を操作するときに Some
値を処理することです。
match
とは異なり、if let
はパターン マッチングでガード節をサポートしていません。
次に示すように、if let
は積み重なってしまうことがあります。let-else
の構成は、このネストされたコードを平坦にする助けとなります。読みづらいバージョンを受講者向けに書き直して、受講者が変化を確認できるようにします。
書き換えたバージョンは次のとおりです。
#![allow(unused)]
fn main() {
fn hex_or_die_trying(maybe_string: Option<String>) -> Result<u32, String> {
let Some(s) = maybe_string else {
return Err(String::from("got None"));
};
let Some(first_byte_char) = s.chars().next() else {
return Err(String::from("got empty string"));
};
let Some(digit) = first_byte_char.to_digit(16) else {
return Err(String::from("not a hex digit"));
};
return Ok(digit);
}
}
- 値がパターンに一致する限り、
while let
ループが繰り返されることを説明します。
name.pop()
でunwrapする値がない場合に中断する if ステートメントを使用して、while let
ループを無限ループに書き換えることができます。while let
は、上記のシナリオの糖衣構文として使用できます。