Rust でカスタム構造体のベクトルをフィルタリングする

Nilesh Katuwal 2023年6月21日
  1. さびフィルター
  2. Rust でのフィルタリングによるカスタム Structs のベクトルの修正
Rust でカスタム構造体のベクトルをフィルタリングする

この記事は、Rust でのカスタム構造体のベクトルのフィルタリングに関するものです。

さびフィルター

Iterator::filter 関数で使用する述語とフィルターを作成するためのライブラリ。 このライブラリには、フィルターを作成し、それらを ANDORNOT などの論理演算子と組み合わせるために使用できる型と特性があります。

Filter トレイトを実装することで、カスタム フィルターを作成できます。 Iterator::filter() 関数での使用を意図していますが、ライブラリは他の関数を含む他の場所で使用できます。

ベクトルを錆フィルタリングする例:

let numbers: Vec<i32> = vec![
  10, 20, 30, 40, 50, 60, 70, 80,
];

let even_number = numbers
  .into_iter()
  .filter(|n| n % 2 == 0)
  .collect::<Vec<_>>();

println!("{:?}", even_number);

出力:

10, 20, 30, 40, 50, 60, 70, 80

Rust でのフィルタリングによるカスタム Structs のベクトルの修正

  1. 参照に対する反復は、実際の値に対する反復と交換する必要があります。 デフォルトのオプションでは、ベクターの所有者であることが必要です。

    iter の代わりに into_iter を使用してループを作成します。

    let the_words: Vec<Words> = words_context
       .vocabularies
       .into_iter()
       .filter(|voc| voc.metadata.identifier == words_id)
       .collect();
    

    それ以外の場合、変更可能な参照が存在する場合、イテレータをドレインできます。

    let the_words: Vec<Words> = words_context
       .vocabularies
       .drain(..)
       .filter(|voc| voc.metadata.identifier == words_id)
       .collect();
    
  1. オブジェクトのクローンを作成すると、それらを複製できます。 これには、反復する型が Clone メソッドを実装する必要があります。

    collect() を呼び出す前に、フィルタリングの直後に cloned() を呼び出して、以前に破棄されたものを複製しないようにすることをお勧めします。

    let the_words: Vec<Words> = words_context
       .vocabularies
       .iter()
       .filter(|voc| voc.metadata.identifier == words_id)
       .cloned()
       .collect();
    
  2. 値よりも参照の Vec を収集する方がよい。 したがって、次のことが必要です。ただし、その後のアイテムを使用する場合は、値ではなく参照でアイテムを取得する必要があります。

    let the_words: Vec<&Words> = words_context
       .vocabularies
       .iter()
       .filter(|voc| voc.metadata.identifier == words_id)
       .collect();
    

    変数の型または collect という単語を指定するだけでよく、両方を同時に指定する必要はありません。 let the_ word: Vec_ を 3つの例すべての最初に使用して、コンパイラがイテレータに基づいてコレクション内に含まれるデータの型を推測できるようにすることができます。