如何写一个加倍迭代器的值?

Bre*_*dly 0 iterator rust

我想从基值开始,1然后将2每次迭代的基值乘以定义的限制(比如我的数组的总长度).

我是否必须实现一个特殊的迭代器才能做到这一点?或者,我可以结合其他方法,迭代器类似map,并filter以实现相同的功能组合在一起.虽然我会想象实现我的迭代器会更有效率,但也更冗长.

She*_*ter 5

你可以使用Iterator::scan:

use std::iter;

fn main() {
    let items = iter::repeat(()).scan(1i32, |state, _| {
        let current_state = *state;
        *state = current_state * 2;
        Some(current_state)
    });

    println!("{:?}", items.take(10).collect::<Vec<_>>());
}
Run Code Online (Sandbox Code Playgroud)

这有一个小的状态,从你的初始值(1i32)开始,每次都加倍状态,返回前一个状态.


由于闭包捕获了它们的环境,你可以不用这样做scan,虽然我喜欢我的迭代器来包含它们需要的所有信息,所以我不太可能真的这样做:

let mut state = 1;
let items = iter::repeat(()).map(|_| {
    let v = state;
    state *= 2;
    v
});
Run Code Online (Sandbox Code Playgroud)

而且总有很长的形式:

struct Doubling {
    value: i32,
}

impl Doubling {
    fn new(value: i32) -> Self {
        Self { value }
    }
}

impl Iterator for Doubling {
    type Item = i32;

    fn next(&mut self) -> Option<Self::Item> {
        let val = self.value;
        self.value *= 2;
        Some(val)
    }
}

fn main() {
    let items = Doubling::new(1);
    println!("{:?}", items.take(10).collect::<Vec<_>>());
}
Run Code Online (Sandbox Code Playgroud)