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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:24:10