如何实现无限整数迭代器并在主函数中调用乘法迭代器?
Rust 无限迭代器与适配器的调用示例
关于初始化迭代器的疑问
你不需要提前调用iter.next()。Infinite::new()初始化current为-1,当你第一次调用next()时,它会自动将current加1并返回0,完全符合你“从0开始生成序列”的需求。直接创建实例即可:
let mut iter = Infinite::new();
应用Multiply迭代器的方法
要把Multiply适配器应用到Infinite迭代器上,需要将Infinite实例装箱(因为Multiply的inner字段是Box<dyn Iterator<Item = i64>>),然后传给Multiply::new。之后就可以像普通迭代器一样调用next(),或者用take()这类方法获取指定数量的元素。
完整示例代码
struct Infinite { current: i64, } impl Infinite { fn new() -> Infinite { Infinite { current: -1 } } } impl Iterator for Infinite { type Item = i64; fn next(&mut self) -> Option<Self::Item> { self.current += 1; Some(self.current) } } struct Multiply { n: i64, inner: Box<dyn Iterator<Item = i64>>, } impl Multiply { fn new(inner: Box<dyn Iterator<Item = i64>>, n: i64) -> Multiply { Multiply { n, inner } } } impl Iterator for Multiply { type Item = i64; fn next(&mut self) -> Option<Self::Item> { // 因为Infinite是无限迭代器,next()永远返回Some,用map替代unwrap更符合Rust风格 self.inner.next().map(|x| x * self.n) } } fn main() { // 创建基础无限迭代器 let infinite_iter = Infinite::new(); // 应用Multiply适配器,将每个元素乘以3 let mut multiply_iter = Multiply::new(Box::new(infinite_iter), 3); // 获取前5个元素并打印 for _ in 0..5 { if let Some(num) = multiply_iter.next() { println!("{}", num); } } // 用take()方法实现更简洁的遍历 let another_multiply = Multiply::new(Box::new(Infinite::new()), 2); for num in another_multiply.take(5) { println!("{}", num); } }
小优化建议
将Multiply的next方法里的unwrap()换成map(),不仅更符合Rust迭代器的设计习惯,还能避免后续如果换成有限迭代器时可能出现的panic,提升代码鲁棒性。
内容的提问来源于stack exchange,提问作者jessica14
相关产品推荐
相关产品推荐

