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
,但是如果我不声明类型,编译器似乎知道并自动选择值,我错过了什么,它不应该是相反的吗?
为什么我必须使用显式类型解引用,而不需要使用_
?
1条答案
按热度按时间2ekbmq321#
.iter()
生成元素类型为&i32
的迭代器。要收集到一个
Vec<i32>
中,你必须引用从引用中复制实际的整数。这就是.map(|n| *n)
所做的。(顺便说一句,.copied()
就是为此而存在的)。Vec<_>
告诉编译器"我只想要一个向量,但是 * 推断 * 元素类型",所以它就这么做了,并从迭代器中选择元素类型:&i32
.您可以在原始的
Vec
上使用.into_iter()
,它将使用向量并直接返回拥有(而不是引用)元素的迭代器(i32
)。