为什么范围必须是 mut 才能对其调用“find”?

Geo*_*Geo 0 rust

我想找到第一个不为 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

DK.*_*DK. 5

findIterator::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没有任何选择。

该范围必须是可变的,因为您将其用作迭代器,并且迭代器必须是可变的才能进行迭代,并且搜索迭代器需要对其进行迭代。