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_
은 컴파일러가 반복자를 기반으로 컬렉션 내에 포함된 데이터 유형을 유추할 수 있도록 세 가지 예제의 시작 부분에 사용할 수 있습니다.