collect
collect メソッドを使うと、Iterator からコレクションを構築できます。
// Copyright 2024 Google LLC // SPDX-License-Identifier: Apache-2.0 fn main() { let primes = vec![2, 3, 5, 7]; let prime_squares = primes.into_iter().map(|p| p * p).collect::<Vec<_>>(); println!("prime_squares: {prime_squares:?}"); }
- どのイテレータでも
Vec、VecDeque、またはHashSetに collect できます。 キーと値のペア(つまり 2 要素のタプル)を生成するイテレータは、HashMapやBTreeMapに collect することもできます。
標準ライブラリのドキュメントで、collect の定義を受講者に見せてください。 このメソッドのジェネリック型 B を指定する方法は 2 つあります。
- 「ターボフィッシュ」を使う方法:
some_iterator.collect::<COLLECTION_TYPE>()。上の例はこの書き方です。 ここで使われている_という省略記法により、Rust はVecの要素型を推論できます。 - 型推論を使う方法:
let prime_squares: Vec<_> = some_iterator.collect(). この形式を使うように例を書き換えてください。
さらに探ってみる
- 受講者がこれがどのように動くのか気になったら、各種コレクション型が イテレータからどのように構築されるかを定義している
FromIteratorトレイトを取り上げるとよいでしょう。 Vec、HashMapなどに対するFromIteratorの基本的な実装に加えて、 さらに特化した実装もあり、Iterator<Item = Result<V, E>>をResult<Vec<V>, E>に変換するといった便利なこともできます。collectで型注釈がしばしば必要になる理由は、戻り値の型に対して ジェネリックになっているからです。そのため、多くの場合にコンパイラが 正しい型を推論しにくくなります。