目次

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

ぎじゅつ

はじめに

#

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

お勉強

#
  • やるか
  • なんだか疲れている

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

メモ

#
  • 多分参照の分配だな
let points = vec![
    Point { x: 0, y: 0 },
    Point { x: 1, y: 5 },
    Point { x: 10, y: -3 },
];

let sum_of_squares: i32 = points
.iter()
.map(|&Point { x, y }| x * x + y * y)
.sum();
  • まぁなんとなく記述でわかるか

  • &Point { x, y }

    • まぁここだよね
  • 借用の渡し方しないと怒られる

  • moveするなってやつだな

let ((feet, inches), Point {x, y}) = ((3, 10), Point { x: 3, y: -10 });
  • これできるのはいいけどクソコードやな

match式の最後のアームとして役に立ちますが、 関数の引数も含めてあらゆるパターンで使えます。リスト18-17に示したようにですね。

ファイル名: src/main.rs

fn foo(_: i32, y: i32) {
    // このコードは、y引数を使うだけです: {}
    println!("This code only uses the y parameter: {}", y);
}

fn main() {
    foo(3, 4);
}

リスト18-17: 関数シグニチャで_を使用する

  • なるほどなー
fn main() {
    let _x = 5;
    let y = 10;
}
  • マジでダメそうな書き方

_だけを使うのとアンダースコアで始まる名前を使うことには微妙な違いがあることに注意してください。 _x記法はそれでも、値を変数に束縛する一方で、_は全く束縛しません。

  • ふーん

多くの部分がある値では、..記法を使用していくつかの部分だけを使用して残りを無視し、 無視する値それぞれにアンダースコアを列挙する必要性を回避できます。

  • 便利そう
struct Point {
x: i32,
y: i32,
z: i32,
}

let origin = Point { x: 0, y: 0, z: 0 };

match origin {
Point { x, .. } => println!("x is {}", x),
}
  • んーでも普通に関数としての引数に取り出した値を渡すか構造体に実装すればよくね
fn main() {
    let numbers = (2, 4, 8, 16, 32);

    match numbers {
        (.., second, ..) => {
            println!("Some numbers: {}", second)
        }
    }
}
  • この書き方は適当だからだめって話しね
  • _すればいい

まとめ

#
  • この章まだ続くな...

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