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:?}");
}
  • どのイテレータでも VecVecDeque、または HashSet に collect できます。 キーと値のペア(つまり 2 要素のタプル)を生成するイテレータは、 HashMapBTreeMap に collect することもできます。

標準ライブラリのドキュメントで、collect の定義を受講者に見せてください。 このメソッドのジェネリック型 B を指定する方法は 2 つあります。

  • 「ターボフィッシュ」を使う方法: some_iterator.collect::<COLLECTION_TYPE>()。上の例はこの書き方です。 ここで使われている _ という省略記法により、Rust は Vec の要素型を推論できます。
  • 型推論を使う方法: let prime_squares: Vec<_> = some_iterator.collect(). この形式を使うように例を書き換えてください。

さらに探ってみる

  • 受講者がこれがどのように動くのか気になったら、各種コレクション型が イテレータからどのように構築されるかを定義している FromIterator トレイトを取り上げるとよいでしょう。
  • VecHashMap などに対する FromIterator の基本的な実装に加えて、 さらに特化した実装もあり、Iterator<Item = Result<V, E>>Result<Vec<V>, E> に変換するといった便利なこともできます。
  • collect で型注釈がしばしば必要になる理由は、戻り値の型に対して ジェネリックになっているからです。そのため、多くの場合にコンパイラが 正しい型を推論しにくくなります。