目次

Rustの勉強[パターンとマッチング その5]

ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

お勉強

#
  • そろそろ面倒になってきた
  • 逆から読んでみるか

NO IMAGEパターン記法 - The Rust Programming Language 日本語版

  • 本当はここから

メモ

#
  • 急に@束縛出てきた
    • わからん
enum Message {
Hello { id: i32 },
}

let msg = Message::Hello { id: 5 };

match msg {
Message::Hello { id: id_variable @ 3..=7 } => {
// 範囲内のidが見つかりました: {}
println!("Found an id in range: {}", id_variable)
},
Message::Hello { id: 10..=12 } => {
// 別の範囲内のidが見つかりました
println!("Found an id in another range")
},
Message::Hello { id } => {
// それ以外のidが見つかりました
println!("Found some other id: {}", id)
},
}
  • うおー記述わかんねー

@を使用することで、値を検査しつつ、1つのパターン内で変数に保存させてくれるのです

  • 意味わかんねー

  • @ 3..=7

    • ここに@を置くらしい
  • おーなるほど

    • ただ変数にいれるだけか
    • 多分範囲指定してる値を参照できないんだろうな
  • さすがにしたから読むの無理だ

  • ブロックごとに読もう

let num = Some(4);

match num {
// 5未満です: {}
Some(x) if x < 5 => println!("less than five: {}", x),
Some(x) => println!("{}", x),
None => (),
}
  • うーん、この記述いいんだろうか

    • マッチガード的な考え方としてはいいけど
    • resultを評価したあとに書いたほうがよくないか
  • したから読んだら全くわからなくなった

  • | がorってなんかでやったな、忘れたが

    • バーティカルバーって呼ぶはず
  • ..=ってなんだよ

    • と思ったが範囲指定か
let x = 'c';

match x {
// ASCII文字前半
'a'..='j' => println!("early ASCII letter"),
// ASCII文字後半
'k'..='z' => println!("late ASCII letter"),
// それ以外
_ => println!("something else"),
}
  • a to zもいけるらしい

NO IMAGEパターン記法 - The Rust Programming Language 日本語版

  • 分配して値を分解するってなんだ
    • イメージがつかん
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let p = Point { x: 0, y: 7 };

    let Point { x: a, y: b } = p;
    assert_eq!(0, a);
    assert_eq!(7, b);
}
  • マジで何書いてあるかわからん
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let p = Point { x: 0, y: 7 };

    let Point { x, y } = p;
    assert_eq!(0, x);
    assert_eq!(7, y);
}
  • んーなるほど
    • 構造体から値を取り出すための短縮的な書き方か

まとめ

#
  • 逆から読んだらありえないぐらいわけわからなかった
  • 構造体の値を取り出す所まで来たなーという感じ

つぎここ
NO IMAGEパターン記法 - The Rust Programming Language 日本語版