锈蚀`borrow_mut`、`borrow_mut`并移动



我的代码是

struct Test<Source>
where
Source: Iterator<Item = char>,
{
source: Source,
}
impl<Source: Iterator<Item = char>> Test<Source> {
fn read(&mut self) {
while let Some(item) = self.source.next() {
match item {
'#' => self.read_head(),
_ => {}
}
println!("Handled char {}", item);
}
}
fn read_head(&mut self) {
println!("Start read heading");
let source = self.source.borrow_mut();
let level = source.take_while(|&char| char == '#').count();
println!("Done, level is {}", level);
}
}
fn main() {
let str = "##### Hello World".to_string();
let str = str.chars().into_iter();
let mut test = Test { source: str };
test.read();
}

效果很好。但在这一行:

let source = self.source.borrow_mut();

如果将borrow_mut更改为borrow,将产生错误:

error[E0507]: cannot move out of `*source` which is behind a shared reference
--> src/main.rs:24:21
|
24 |         let level = source.take_while(|&char| char == '#').count();
|                     ^^^^^^ move occurs because `*source` has type `Source`, which does not implement the `Copy` trait

那么,为什么borrow_mut有效,而借入无效呢。我对CCD_ 3和CCD_。

为什么borrow_mut有效而borrow无效。

因为有一个Iterator的实现用于对迭代器的独占引用:

impl<'_, I> Iterator for &'_ mut I where I: Iterator + ?Sized

这意味着对迭代器的独占引用本身就是迭代器;"照原样";(顺便说一句,这就是为什么Iterator::by_ref是一件有用的东西(。

我对moveborrow之间的关系还不太清楚。

本身没有迭代器,只是在这种情况下,对迭代器的可变引用也是迭代器(本身(,这意味着它满足了take_while的要求,即按值获取迭代器:

pub fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> where P: FnMut(&Self::Item) -> bool

共享引用不是这样的,因此会触发您看到的错误。

相关内容

  • 没有找到相关文章

最新更新