Rust에서 사용자 정의 구조체 벡터 필터링

Nilesh Katuwal 2023년6월21일
  1. 녹 필터
  2. Rust에서 필터링하여 커스텀 Structs의 벡터 수정
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의 벡터 수정

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