use std::iter::Peekable;
pub trait AdvanceWhile<I: Iterator> {
fn advance_while<P>(&mut self, predicate: P)
where
P: Fn(&I::Item) -> bool;
}
impl<I: Iterator> AdvanceWhile<I> for Peekable<I> {
fn advance_while<P>(&mut self, predicate: P)
where
P: Fn(&I::Item) -> bool,
{
while let Some(val) = self.peek() {
if predicate(val) {
self.next();
} else {
break;
}
}
}
}
错误:
error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src/main.rs:16:17
|
14 | while let Some(val) = self.peek() {
| ---- first mutable borrow occurs here
15 | if predicate(val) {
16 | self.next();
| ^^^^ second mutable borrow occurs here
...
20 | }
| - first borrow ends here
最佳答案
作为Lukas Kalbertodt已经说过,这是借用检查器的局限性。在这里我想展示一个更具可读性的版本:
fn advance_while<P>(&mut self, predicate: P)
where P: Fn(&I::Item) -> bool
{
while let Some(true) = self.peek().map(&predicate) {
self.next();
}
}
关于rust - 如何根据 Peekable::peek 的结果调用 Peekable::next?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47891609/