Rust中如何获取迭代器的当前元素?
Rust中如何获取迭代器的当前元素?
Rust标准库的基础迭代器(实现std::iter::Iterator trait的类型)并没有提供current()方法,这是因为迭代器的核心设计是单向、消耗式的:只有调用next()才会推进迭代器并返回当前指向的元素,迭代器本身不会缓存“当前元素”——它要么处于未启动状态,要么已经推进到下一个位置,没有保留上一个元素的默认逻辑。
可行解决方案
手动缓存已获取的元素
这是最直接且常用的方式,每次调用next()后把结果存入变量,后续需要“当前元素”时直接使用这个缓存值:fn main() { let x = vec![1, 2, 3, 4, 5]; let mut iterator = x.iter(); // 获取第一个元素并缓存 let mut current = iterator.next().unwrap(); println!("当前元素: {}", current); // 输出 1 // 推进迭代器并更新缓存 if let Some(next_val) = iterator.next() { current = next_val; println!("当前元素: {}", current); // 输出 2 } }使用
Peekable查看下一个元素(非当前)
如果你的需求是“预看”下一个元素而不推进迭代器,可以使用std::iter::Peekable适配器,但它依然没有直接的current()方法,需要结合缓存来记录已获取的元素:fn main() { let x = vec![1, 2, 3, 4, 5]; let mut iterator = x.iter().peekable(); // 获取第一个元素并缓存 let current = iterator.next().unwrap(); println!("当前元素: {}", current); // 输出 1 // 查看下一个元素但不推进迭代器 if let Some(&next_val) = iterator.peek() { println!("下一个元素: {}", next_val); // 输出 2 } // 当前元素仍是之前缓存的值 println!("当前元素仍为: {}", current); // 输出 1 }自定义带
current()方法的迭代器
如果需要频繁使用“获取当前元素”的功能,可以封装一个自定义迭代器结构体,内部缓存当前元素:struct WithCurrent<I> { iter: I, current: Option<<I as Iterator>::Item>, } impl<I: Iterator> WithCurrent<I> { // 初始化时获取第一个元素作为初始current fn new(mut iter: I) -> Self { let current = iter.next(); Self { iter, current } } // 返回当前元素的引用 fn current(&self) -> Option<&<I as Iterator>::Item> { self.current.as_ref() } // 推进迭代器并更新current fn next(&mut self) -> Option<<I as Iterator>::Item> { let next_val = self.iter.next(); self.current = next_val.clone(); next_val } } fn main() { let x = vec![1, 2, 3, 4, 5]; let mut iter = WithCurrent::new(x.iter()); println!("当前元素: {:?}", iter.current()); // 输出 Some(&1) iter.next(); println!("当前元素: {:?}", iter.current()); // 输出 Some(&2) }
内容的提问来源于stack exchange,提问作者Kuly14
相关产品推荐
相关产品推荐

