collect()とか::<T>構文とか
collect()
はイテレータを指定のコレクション型にキャストするメソッド
利用場面はこんな感じだと思う
//処理をして再びコレクションとして扱う let v = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9]; let closure = ここで処理内容は重要ではない ; let result: Vec<u8> = v.iter().map(&closure).collect(); //Rangeから数値のベクタをつくる let result :Vec<u8> = (0..10).collect();
collect()
を使うときはなんらかの形で型を明示しなければいけない。*1
先のコードでは変数に型アノテーションを付与したが、別の方法もある。
Rustでは::<T>
という構文で戻り値の型を指定することができる。turbofishっていう構文らしい
例えば先のコードはこんな風に書ける
let result = v.iter().map(&closure).collect::<Vec<u8>>();
collect()
にかぎらず他のメソッドでも同様に使えるようだ
let v = Vec::<i32>::new(); let x = "42".parse::<i32>(); assert_eq!(42, x.unwrap())
なんだか引数のように型を指定できて、僕はこちらも好きです
勉強したサイト
Rust の turbofish と GHC 8 の Type Application ― または我々は如何にして多相な関数を単相化するか - ryota-ka's blog
ジェネリクスとturbofishの公式doc、旧版だけどわかりやすかった
Generics - The Rust Programming Language
現行の第2版
B - Operators and Symbols - The Rust Programming Language