是否可以查看迭代器的可变引用?

问题描述 投票:0回答:1

我有一个函数,它接受迭代器的可变引用。 在该函数中,我想查看迭代器以检查其中是否有剩余项目。如果是这种情况,我想返回一个错误并且迭代器不会前进。

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
),因此它不会丢失。

rust iterator
1个回答
1
投票

这是不可能的,因为

Iterator
特征没有提供这样做的方法。它只提供了一个
next()
方法,并且该方法推进迭代器。

您可以通过不返回自定义枚举,而是直接返回

Peekable
来改进当前的解决方案,这样您就可以将其用作迭代器。

© www.soinside.com 2019 - 2024. All rights reserved.