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

如何在Rust中实现跳过迭代器的第N个元素?

实现Rust风格的“跳过每第N个元素”迭代器方法

标准库和itertools目前都没有直接提供跳过每第N个元素的现成函数,但你可以通过**特性扩展(Extension Trait)**来实现符合Rust风格的链式调用,也就是你想要的.skip_every(n)语法。

实现方式

定义一个扩展特性,为所有Iterator类型添加skip_every方法:

trait SkipEveryExt: Iterator {
    fn skip_every(self, n: usize) -> impl Iterator<Item = Self::Item>
    where
        Self: Sized,
    {
        self.enumerate()
            .filter_map(|(idx, item)| {
                // 索引从0开始,用idx+1判断是否为第n个元素
                if (idx + 1) % n != 0 {
                    Some(item)
                } else {
                    None
                }
            })
    }
}

// 为所有Iterator类型实现该扩展特性
impl<I: Iterator> SkipEveryExt for I {}

使用示例

现在你可以像预想的那样链式调用这个方法:

fn main() {
    let nums: Vec<_> = (0..100).skip_every(7).collect();
    // 验证结果:不会包含6、13、20...这类对应第7个位置的元素
    println!("{nums:?}");
}

逻辑说明

  • 借助enumerate()为每个元素绑定从0开始的索引
  • 通过filter_map同时完成过滤与映射:当(索引+1)能被n整除时,判定为第n个元素并返回None跳过;否则返回Some(item)保留元素
  • 该实现遵循Rust迭代器的惰性求值特性,不会提前消耗整个迭代器

内容的提问来源于stack exchange,提问作者Cornelius Roemer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:30:45