やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustのパターン(論駁可能性)

 パターンに一致しない可能性がある場合。

成果物

参考

論駁可能性

 パターンには2種類ある。論駁ろんばく可能なものと、不可能なもの。

論駁不可能

 あらゆるパターンに合致する。

let x = 5;
  • 関数の引数
  • let
  • for

論駁可能

 合致しないことがある。

if let Some(x) = value;

 valueの値はNoneもありうる。(Some, NoneOption列挙体の列挙子である。パターンにSomeを指定したならvalueはOption列挙体型である。ならばvalueは同型の列挙子Noneである可能性もある)

  • if let
  • while let

エラー

letで論駁可能なパターンを使うとエラー

fn main() {
    let v = Some(0);
    let Some(x) = v;
}
$ rustc main.rs
error[E0005]: refutable pattern in local binding: `None` not covered
 --> main.rs:7:9
  |
7 |     let Some(x) = v;
  |         ^^^^^^^ pattern `None` not covered

 修正するなら以下。

fn main() {
    let v = Some(0);
    if let Some(x) = v {
        println!("{}", x);
    }
}

if letで論駁不可能なパターンを使うとワーニング

fn main() {
    if let x = 5 {
        println!("{}", x);
    };
}
$ rustc main.rs
warning: irrefutable if-let pattern
 --> main.rs:6:5
  |
6 | /     if let x = 5 {
7 | |         println!("{}", x);
8 | |     };
  | |_____^
  |
  = note: #[warn(irrefutable_let_patterns)] on by default

 ドキュメントではerror[E0162]: irrefutable if-let patternになるらしい。私の環境ではコンパイルできてしまった。警告だけ出る。

 実行もされる。

$ ./main
5

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで