수색…


소개

반복자는 Iterator 특성으로 설명되는 Rust의 강력한 언어 기능입니다. 반복자는 컬렉션과 같은 유형 (예 : Vec<T> 에 대해 많은 작업을 수행 할 수있게하며 쉽게 구성 할 수 있습니다.

어댑터 및 소비자

반복자 메소드는 두 개의 별개의 그룹으로 나눌 수 있습니다.

어댑터

어댑터는 반복자를 가져 와서 다른 반복자를 반환합니다.

//         Iterator  Adapter
//             |       |
let my_map = (1..6).map(|x| x * x);
println!("{:?}", my_map);
산출
Map { iter: 1..6 }

값은 열거되지 않았으므로 반복자가 열심히 평가되지 않는다는 것을 나타냅니다. 반복자는 "게으른"것입니다.

소비자

소비자는 반복자를 가져 와서 반복자가 아닌 다른 것을 반환하고 그 과정에서 반복자를 소비합니다.

//                    Iterator  Adapter       Consumer
//                        |       |              |
let my_squares: Vec<_> = (1..6).map(|x| x * x).collect();
println!("{:?}", my_squares);
산출
[1, 4, 9, 16, 25]

소비자의 다른 예로는 find , foldsum 있습니다.

let my_squared_sum: u32 = (1..6).map(|x| x * x).sum();
println!("{:?}", my_squared_sum);
산출
55

짧은 소수 테스트

fn is_prime(n: u64) -> bool {
    (2..n).all(|divisor| n % divisor != 0)
}

물론 이것은 빠른 테스트가 아닙니다. n 제곱근에서 테스트를 중지 할 수 있습니다.

(2..n)
    .take_while(|divisor| divisor * divisor <= n)
    .all(|divisor| n % divisor != 0)

맞춤 반복기

struct Fibonacci(u64, u64);

impl Iterator for Fibonacci {
    type Item = u64;
    
    // The method that generates each item
    fn next(&mut self) -> Option<Self::Item> {
        let ret = self.0;
        self.0 = self.1;
        self.1 += ret;
        
        Some(ret) // since `None` is never returned, we have an infinite iterator
    }

    // Implementing the `next()` method suffices since every other iterator
    // method has a default implementation
}

사용 예 :

// the iterator method `take()` is an adapter which limits the number of items
// generated by the original iterator
for i in Fibonacci(0, 1).take(10) {
    println!("{}", i);
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow