rust - 如何根据 Peekable::peek 的结果调用 Peekable::next?

标签 rust

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;
            }
        }
    }
}

Playground

错误:

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/

相关文章:

rust - 使用 box 关键字和 Box::new 有什么区别?

Rust 集成测试无法 `use` 库

rust - 使用 LD.LLD 链接 Rust 二进制文件

rust - 如何访问嵌套模块中定义的符号?

linux - 如何使用gdk和Rust获取当前事件窗口的标题?

rust - 如何为用属性本身注释的结构提供字段属性?

struct - 在 Rust 中是否保证了 struct 字段的初始化顺序?

generics - 在通用变量中存储嵌套特征实例

string - 生命周期如何作用于常量字符串/字符串文字?

rust - 内部Rust结构是否可以传递给其所有者的引用? [复制]