gpt4 book ai didi

rust - 为什么 iter() 需要 & 对于 lambda 函数,而 range 在这个例子中不需要

转载 作者:行者123 更新时间:2023-11-29 07:58:24 24 4
gpt4 key购买 nike

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

我认为 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);
}

最佳答案

只知道他们都是 Iterator不知道Iterator s 类型参数不会告诉您有关它们正在迭代的内容的任何信息,这是这里的重要区别。对于此代码:

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

slice iterator返回直接指向切片的引用(它必须这样做,或者,对于一般的 T ,它会试图从借来的切片中窃取所有权 &[T] :非法),而 range只按值返回计数器,因为它是在内部构建的,并且可以自由分发(“转让所有权”)。

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

关于rust - 为什么 iter() 需要 & 对于 lambda 函数,而 range 在这个例子中不需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23440734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com