我有一个函数,它接受迭代器的可变引用。 在该函数中,我想查看迭代器以检查其中是否有剩余项目。如果是这种情况,我想返回一个错误并且迭代器不会前进。
MRE:
fn process<I>(iter: &mut I) -> bool
where
I: Iterator<Item = char>,
{
iter.peekable().peek().is_some()
}
fn main() {
let mut iter = "Hello, world!".chars().into_iter();
process(&mut iter);
assert_eq!(iter.next(), Some('H'));
}
然而,正如我天真地期望的那样,这不起作用。 链接
如果我所拥有的只是对迭代器的可变引用,是否可以查看迭代器?
由于出于兼容性原因,我不想更改函数的签名,因此我目前通过返回
iter.next()
的值来解决此问题(如果它是函数 Some()
内的错误枚举变体中的 Result
),因此它不会丢失。
这是不可能的,因为
Iterator
特征没有提供这样做的方法。它只提供了一个 next()
方法,并且该方法推进迭代器。
您可以通过不返回自定义枚举,而是直接返回
Peekable
来改进当前的解决方案,这样您就可以将其用作迭代器。