【问题标题】:"cannot move out of borrowed content" when using skip_while()使用 skip_while() 时“无法移出借用的内容”
【发布时间】:2015-12-30 13:32:41
【问题描述】:

我无法使用std::iter::Peekable。为什么下面的代码不能编译?

// rustc 1.7.0-nightly (b4707ebca 2015-12-27)

use std::iter::*;

struct Foo<'a> {
    chars: Peekable<Chars<'a>>,
}

impl<'a> Foo<'a> {
   fn foo(&mut self) {
       self.chars.next(); // Ok
       self.chars.skip_while(|c| true); // error: cannot move out of borrowed content [E0507]
   }
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    skip_while 按价值取舍。但是chars 不能移动,因为它仍然可变地被&amp;mut self 借用。您可以使用by_ref 来确保skip_while 获取的值是对包装器的引用。

    self.chars.by_ref().skip_while(|c| true);
    

    【讨论】:

    • 为什么不可复制的结构会实现以 self 为值的方法?假设在它之后调用其他方法是合理的,那就是......
    • @weberc2 skip_while 是 Iterator 的方法,而不是 Chars 的固有方法(因此无法实现取 &self)。不过,一般来说,按值获取 self 并不会阻止传递引用(self 变为 &self,然后 &self 会按值传递)。在这种情况下,我们正是这样做的,使用 by_ref 适配器。
    猜你喜欢
    • 2018-04-04
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2018-09-19
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多