如何在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
相关产品推荐
相关产品推荐

