4. Refutability - 網羅しているか
refutable - マッチに失敗する可能性がある
irrefutable - refutable でない
let x = Some(42);
let Some(y) = x;
error[E0005]: refutable pattern in local binding:
`None` not covered
--> src/main.rs:3:9
|
3 | let Some(y) = x;
| ^^^^^^^ pattern `None` not covered
5. while loops
irrefutable
loop + match で書ける
'label: while let PAT = EXPR {
/* loop body */
}
'label: loop {
match EXPR {
PAT => { /* loop body */ },
_ => break,
}
}
6. for loops
irrefutable
match + let + loop で書ける
for PATTERN in EXPR {
/* loop body */
}
ここで EXPR は std::iter::IntoIterator を実装する
7. 'label: for PATTERN in expr {
/* loop body */
}
{
let result = match IntoIterator::into_iter(expr) {
mut iter => 'label: loop {
let mut next;
match Iterator::next(&mut iter) {
Option::Some(val) => next = val,
Option::None => break,
};
let PATTERN = next;
let () = { /* loop body */ };
},
};
result
}
8. let statement と if let statement
refutable なら if let 、irrefutable なら let
if let は match で書ける
if let PAT = EXPR {
/* body */
} else {
/*else */
}
match EXPR {
PAT => { /* body */ },
_ => { /* else */ }, // () if there is no else
}
9. if let にirrefutable なパターン
if let x = 42 {
println!("{}", x);
};
warning: irrefutable if-let pattern
--> src/main.rs:2:5
|
2 | / if let x = 42 {
3 | | println!("{}", x);
4 | | }
| |_____^
|
= note: #[warn(irrefutable_let_patterns)] on by default
14. 名前が _ から始まる変数
使われない変数を _ から始まる変数で束縛するな
let s = Some(String::from("Hello"));
if let Some(_s) = s { // _s is not used but
println!("matched"); // takes ownership
}
println!("{}", s); // :<