やってみる

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

Rustのパターン

 タプルを代入する式とかで使う。

成果物

参考

パターン(データ構造)

 以下を組合せる。

パターンが使用されうる場所一覧

  • matchアーム
  • if let
  • while let
  • for
  • let
  • fnの引数

matchアーム

match VALUE {
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
}
  • VALUEPATTERNに一致するなら、EXPRESSIONを実行する
  • matchは全パターンを網羅せねばコンパイルエラーになる。_パターンは全パターンに一致する。

if let

fn main() {
    let favorite_color: Option<&str> = None;
    let is_tuesday = false;
    let age: Result<u8, _> = "34".parse();

    if let Some(color) = favorite_color {
        println!("Using your favorite color, {}, as the background", color);
    } else if is_tuesday {
        println!("Tuesday is green day!");
    } else if let Ok(age) = age {
        if age > 30 {
            println!("Using purple as the background color");
        } else {
            println!("Using orange as the background color");
        }
    } else {
        println!("Using blue as the background color");
    }
}
  • 条件式は変数に関係ないものでも可
  • パターン網羅をコンパイルエラーで検出しない

while let

fn main() {
    let mut stack = Vec::new();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    while let Some(top) = stack.pop() {
        println!("{}", top);
    }
}
$ ./main
3
2
1
  • パターンが一致しつづけるかぎりループする

 最後はNoneになるためSomeではなくなる。よって終了する。

for

fn main() {
    let v = vec!['a', 'b', 'c'];
    for (index, value) in v.iter().enumerate() {
        println!("{} is at index {}", value, index);
    }
}
  • for パターン in 式
$ ./main
a is at index 0
b is at index 1
c is at index 2

let

let x = 5;
let (x, y, z) = (1, 2, 3);
let (x, y) = (1, 2, 3); // error[E0308]: mismatched types
  • let PATTERN = EXPRESSION;

fnの引数

fn foo(x: i32) {}
fn print_coordinates(&(x, y): &(i32, i32)) {
    println!("Current location: ({}, {})", x, y);
}
fn main() {
    let point = (3, 5);
    print_coordinates(&point);
}

 関数の引数にパターンを使っている。クロージャの引数も同様。

対象環境

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

前回まで