我想找到第一个不是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
?
答案 0 :(得分:4)
find
为Iterator::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
没有任何选择。
范围必须是可变的,因为你将它用作迭代器,并且迭代器必须是可变的迭代,并且搜索迭代器需要迭代它。