Rust 为什么iter()需要&;对于lambda函数,而range不';在本例中,t

Rust 为什么iter()需要&;对于lambda函数,而range不';在本例中,t,rust,Rust,我在理解此示例中的差异时遇到一些困难: 我认为range(…)和iter()都是std::iter::Iterator 那么,为什么我可以将第一个示例中的|x |传递到映射和过滤器,但在第二个示例中必须将其作为|&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 easi

我在理解此示例中的差异时遇到一些困难:

我认为
range(…)
iter()
都是
std::iter::Iterator
那么,为什么我可以将第一个示例中的
|x |
传递到
映射
过滤器
,但在第二个示例中必须将其作为
|&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);
}

仅仅知道它们都是
Iterator
,而不知道
Iterator
s类型参数,并不能告诉您它们迭代的内容,这是这里的重要区别。对于此代码:

  • range1
    是一个
    迭代器
  • range2.iter()是一个
    迭代器
也就是说,返回直接指向切片的引用(它必须这样做,或者,对于一般的
T
,它将试图从借用的切片中窃取所有权
&[T]
:非法),而
范围
只按值返回计数器,因为它在内部构造计数器,并且可以自由地将其分发出去(“转让所有权”)


因此,要从切片迭代器中获得
int
,您需要以某种方式取消引用,例如,通过
|&x |……
进行模式匹配,或者编写
|x |*x**x
过滤器
调用中不应包含
&
:在
映射
部分之后,您正在处理
int
ra除了
&int
@ChrisMorgan,否,
过滤器
接收对项目的引用,而不是项目本身。