while let
类似于if let,while let 可以使劲匹配更多序列。例如考虑以下序列:
// Make `optional` of type `Option ` let mut optional = Some(0); // Repeatedly try this test. loop { match optional { // If `optional` destructures, evaluate the block. Some(i) => { if i > 9 { println!("Greater than 9, quit!"); optional = None; } else { println!("`i` is `{:?}`. Try again.", i); optional = Some(i + 1); } // ^ Requires 3 indentations! }, // Quit when the destructure fails, meaning `break`. _ => { break; } // ^ Why should this be required? Seems superfluous. } }
while let
使该序列好得更多:
fn main() { // Make `optional` of type `Option ` let mut optional = Some(0); // This reads: "while `let` destructures `optional` into // `Some(i)`, evaluate the block (`{}`). Else `break`. while let Some(i) = optional { if i > 9 { println!("Greater than 9, quit!"); optional = None; } else { println!("`i` is `{:?}`. Try again.", i); optional = Some(i + 1); } // ^ Less rightward drift and doesn't require // explicitly handling the failing case. } // ^ `if let` had additional optional `else`/`else if` // clauses. `while let` does not have these. }
也可以参考:
enum
, Option
, 和 RFC