You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现无限整数迭代器并在主函数中调用乘法迭代器?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:48:23