为什么iter()需要&用于lambda函数,而范围不在此示例中

Era*_*dan 3 rust

我在理解这个例子中的差异时遇到了一些麻烦:

我想这两个range(..)iter()std::iter::Iterator 这样,为什么我可以通过|x|在第一个例子mapfilter,但必须把它作为|&x|在第二个例子吗?

use std::iter::AdditiveIterator;

fn main() {
    let range1 = range(1,9);
    let range2 = [1,2,3,4,5,6,7,8,9];

    //indented for easier visualization
    let sum1 = range1       .map(| x| x * x).filter(| x| x % 2 == 0).sum();
    let sum2 = range2.iter().map(|&x| x * x).filter(|&x| x % 2 == 0).sum();

    println!("{}", sum1);
    println!("{}", sum2);
}
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 5

只知道他们都不Iterator知道Iterators类型参数并没有告诉你他们正在迭代什么,这是重要的区别.对于此代码:

  • range1 是一个 Iterator<int>
  • range2.iter() 是一个 Iterator<&int>

也就是说,切片迭代器返回直接指向切片的引用(它必须这样做,或者,一般来说T,它会试图从借用的切片中窃取所有权&[T]:非法),而range只是返回计数器的值,因为它构造它在内部,可以自由发放("转让所有权").

因此,要获得int切片迭代器,您需要以某种方式取消引用引用,例如通过它进行模式匹配|&x| ...,或者写入|x| *x * *x.