我想从基值开始,1然后将2每次迭代的基值乘以定义的限制(比如我的数组的总长度).
我是否必须实现一个特殊的迭代器才能做到这一点?或者,我可以结合其他方法,迭代器类似map,并filter以实现相同的功能组合在一起.虽然我会想象实现我的迭代器会更有效率,但也更冗长.
你可以使用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)
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |