LoginSignup
19
6

More than 3 years have passed since last update.

[Rust] tuple struct, enumは暗黙にコンストラクタをクロージャとして定義する

Last updated at Posted at 2020-03-20

2020-03-21 追記 tric さんが詳しいコメントをくださいました (こちら) ので, そちらもご覧ください. 本記事の用語法は不適切で, クロージャというより関数ポインタと呼ぶべきでした.


何が言いたいかというと, 次のコードを見てください (PlayGround).

#[derive(Debug)]
struct Data(i32);

fn main() {
    let data = vec![ 2020 ];
    let data = data
        .into_iter()
        .map(Data) // <- ここに注目!
        .collect::<Vec<_>>();
    println!("{:?}", data); // 出力: [Data(2020)]
}

Data はここで定義した struct の名前ですが, 同じ名前のクロージャ Fn(i32) -> Dataとして使うことができます. struct Data(i32, f64) だったら Fn(i32, f64) -> Data です.

enum でも同じようなことができます (PlayGround).

#[derive(Debug)]
enum Data {
    Number(i32),
}

fn main() {
    let nums = (0..4).map(Data::Number).collect::<Vec<_>>();
    println!("{:?}", nums); // 出力: [Number(0), Number(1), Number(2), Number(3)]
}

周知の事実だったらごめんなさい. 以上, 今日の収穫でした.

参考文献

追加分 (2020-03-21)

19
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
6