Rust でカスタム構造体のベクトルをフィルタリングする
この記事は、Rust でのカスタム構造体のベクトルのフィルタリングに関するものです。
さびフィルター
Iterator::filter
関数で使用する述語とフィルターを作成するためのライブラリ。 このライブラリには、フィルターを作成し、それらを AND
、OR
、NOT
などの論理演算子と組み合わせるために使用できる型と特性があります。
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
のベクトルの修正
-
参照に対する反復は、実際の値に対する反復と交換する必要があります。 デフォルトのオプションでは、ベクターの所有者であることが必要です。
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();
-
オブジェクトのクローンを作成すると、それらを複製できます。 これには、反復する型が
Clone
メソッドを実装する必要があります。collect()
を呼び出す前に、フィルタリングの直後にcloned()
を呼び出して、以前に破棄されたものを複製しないようにすることをお勧めします。let the_words: Vec<Words> = words_context .vocabularies .iter() .filter(|voc| voc.metadata.identifier == words_id) .cloned() .collect();
-
値よりも参照の
Vec
を収集する方がよい。 したがって、次のことが必要です。ただし、その後のアイテムを使用する場合は、値ではなく参照でアイテムを取得する必要があります。let the_words: Vec<&Words> = words_context .vocabularies .iter() .filter(|voc| voc.metadata.identifier == words_id) .collect();
変数の型または
collect
という単語を指定するだけでよく、両方を同時に指定する必要はありません。let the_ word: Vec_
を 3つの例すべての最初に使用して、コンパイラがイテレータに基づいてコレクション内に含まれるデータの型を推測できるようにすることができます。