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)]
}
周知の事実だったらごめんなさい. 以上, 今日の収穫でした.