rust vec!()使用显式类型迭代时取消引用

pcww981p  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(166)
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];

  let even_numbers: Vec<i32> = numbers.iter().filter(|&n| n % 2 == 0).map(|n| *n).collect();
    
  let even_numbers: Vec<_> = numbers.iter().filter(|&n| n % 2 == 0).map(|n| n).collect();

当类型是显式的时候,我必须解引用n,但是如果我不声明类型,编译器似乎知道并自动选择值,我错过了什么,它不应该是相反的吗?
为什么我必须使用显式类型解引用,而不需要使用_

2ekbmq32

2ekbmq321#

.iter()生成元素类型为&i32的迭代器。
要收集到一个Vec<i32>中,你必须引用从引用中复制实际的整数。这就是.map(|n| *n)所做的。(顺便说一句,.copied()就是为此而存在的)。
Vec<_>告诉编译器"我只想要一个向量,但是 * 推断 * 元素类型",所以它就这么做了,并从迭代器中选择元素类型:&i32.
您可以在原始的Vec上使用.into_iter(),它将使用向量并直接返回拥有(而不是引用)元素的迭代器(i32)。

相关问题