为什么一个范围必须是mut才能在其上调用`find`?

时间:2017-12-09 00:28:47

标签: rust

我想找到第一个不是0的偶数。我对改变它不感兴趣,所以我认为上面这段代码会给我一个不可变的选项:

fn main() {
    let first_ten = 0..10;
    let val = first_ten.find(|&n| (n % 2 == 0) && n > 0);
    println!("{}", val.unwrap());
}

相反,我收到以下错误:

 --> src/main.rs:3:13
  |
2 |   let first_ten = 0..10;
  |       --------- consider changing this to `mut first_ten`
3 |   let val = first_ten.find(|&n| (n % 2 == 0) && n > 0);
  |             ^^^^^^^^^ cannot borrow mutably

我找到了this documentation page,我发现谓词定义为:

P: FnMut(&Self::Item) -> bool, 

如果我将first_ten的定义更改为let mut first_ten = 0..10,则代码可以正常运行。为什么first_ten需要mut

1 个答案:

答案 0 :(得分:4)

findIterator::find,其定义为:

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>

谓词的定义无关紧要。重要的部分是&mut self

为什么&mut self而不是&self?因为它是在Iterator上定义的,Iterator(实现必须提供的即。)上唯一的基本方法是next,即:

 fn next(&mut self) -> Option<Self::Item>;

Iterator获得下一件事的唯一方法就是改变它。 find没有任何选择。

范围必须是可变的,因为你将它用作迭代器,并且迭代器必须是可变的迭代,并且搜索迭代器需要迭代它。

相关问题