类似于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. |
} |