我想找到第一个不为 0 的偶数。我对改变它不感兴趣,所以我认为上面的代码会给我一个不可变的选项:
fn main() {
let first_ten = 0..10;
let val = first_ten.find(|&n| (n % 2 == 0) && n > 0);
println!("{}", val.unwrap());
}
Run Code Online (Sandbox Code Playgroud)
相反,我收到以下错误:
fn main() {
let first_ten = 0..10;
let val = first_ten.find(|&n| (n % 2 == 0) && n > 0);
println!("{}", val.unwrap());
}
Run Code Online (Sandbox Code Playgroud)
我找到了这个文档页面,我看到谓词定义为:
P: FnMut(&Self::Item) -> bool,
Run Code Online (Sandbox Code Playgroud)
first_ten如果我更改to be的定义let mut first_ten = 0..10,那么代码就可以工作。为什么first_ten需要有mut?
find是Iterator::find,其定义为:
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
Run Code Online (Sandbox Code Playgroud)
谓词的定义是无关紧要的。重要的部分是&mut self。
为什么是&mut self又不是&self?因为它是在 上定义的Iterator,并且唯一的基本方法Iterator(即实现必须提供)是next,即:
fn next(&mut self) -> Option<Self::Item>;
Run Code Online (Sandbox Code Playgroud)
从 an 中获得下一个东西的唯一方法Iterator就是对其进行变异。 find没有任何选择。
该范围必须是可变的,因为您将其用作迭代器,并且迭代器必须是可变的才能进行迭代,并且搜索迭代器需要对其进行迭代。