Rust中是否存在接收谓词并返回索引与匹配元素的迭代器方法?
如何在Rust中同时获取迭代器元素的位置与元素本身
你可以通过enumerate()方法将迭代器转换为包含索引(位置)和元素的元组迭代器,再结合find()实现需求,无需克隆迭代器:
直接实现
let vec = vec![1, 2, 40, 3]; let mut iter = vec.into_iter().enumerate(); if let Some((pos, elt)) = iter.find(|&(_, x)| x > 10) { println!("{pos} {elt}"); // 输出 2 40 }
enumerate()会为每个元素附加从0开始的索引,之后调用find()就能一次性筛选出第一个满足条件的(位置, 元素)元组,整个过程只遍历一次迭代器,完全避免了克隆开销。
封装为通用扩展方法(可复用)
如果需要在多处使用类似逻辑,可以给Iterator trait添加扩展方法:
trait IteratorPositionFind: Iterator { fn position_find<P>(mut self, predicate: P) -> Option<(usize, Self::Item)> where P: FnMut(&Self::Item) -> bool, { self.enumerate().find(|(_, item)| predicate(item)) } } impl<I: Iterator> IteratorPositionFind for I {} // 使用示例 let iter = vec![1, 2, 40, 3].into_iter(); if let Some((pos, elt)) = iter.position_find(|&x| x > 10) { println!("{pos} {elt}"); // 2 40 }
这个扩展方法内部复用了enumerate()和find()的组合,让所有迭代器都能直接调用position_find方法,和你设想的API完全一致。
标准库没有提供这个方法的原因是,enumerate() + find()的组合已经足够简洁灵活,单独新增API会增加标准库的复杂度,不符合其"最小必要"的设计原则。
内容的提问来源于stack exchange,提问作者Lina Blume
相关产品推荐
相关产品推荐

