我在寻找这样的东西:
let iter = vec![1, 2, 40, 3].into_iter();
let (pos, elt) = iter.position_find(|&x| x > 10);
// ^ does not exist
println!("{pos} {elt}"); // 2 40Iterator::position和Iterator::find都提前了迭代器,所以除非我克隆迭代器,否则我不能同时使用这两种迭代器,这在这里是不必要的。
发布于 2022-08-21 18:19:00
您可以将find与enumerate一起使用。
let iter = vec![1, 2, 40, 3].into_iter();
if let Some((pos, elt)) = iter.enumerate().find(|(i, x)| x > &10) {
println!("{pos} {elt}"); // 2 40
}如果您不想每次写出来,您甚至可以将其转换为可拓性状,以便在所有迭代器上自动将其实现为方法:
trait FindPosition: Iterator {
fn find_position<F: FnMut(usize, &Self::Item) -> bool>(
&mut self,
mut f: F,
) -> Option<(usize, Self::Item)> {
self.enumerate().find(|(i, item)| f(*i, item))
}
}
impl<I: Iterator> FindPosition for I {}
fn main() {
let mut iter = vec![1, 2, 40, 3].into_iter();
if let Some((pos, elt)) = iter.find_position(|_, x| *x > 10) {
println!("{pos} {elt}"); // 2 40
}
}https://stackoverflow.com/questions/73437109
复制相似问题