0..3和[0, 1, 2].iter()之间的区别

4
我可以为范围类型执行此操作:
(0..3).collect::<Vec<i32>>();

但对于以下内容,我无法做到相同的效果:
[0, 1, 2].iter().collect::<Vec<i32>>();

我得到的结果是:

 error: the trait `core::iter::FromIterator<&_>` is not implemented for the type `collections::vec::Vec<i32>` [E0277]

为了避免这种错误,我需要执行以下操作:
[0, 1, 2].iter().map(|&x| x).collect::<Vec<i32>>();

为什么会这样?我原以为这两种方式是做同一件事情的不同方式。

3
顺便提一下:在第二个例子中,你可以使用.cloned(),而不是.map(|&x| x) - Lambda Fairy
1个回答

11

它们并不是同一件事。

这里的问题在于对数组调用iter会生成一个&i32Iterator。为了能够处理所有可能的数组,它不能通过返回元素值的方式来工作,因为并非所有类型都实现了Copy,而且你无法部分地移动出数组。因此,为了将其收集到一个Vec<i32>中,你必须通过复制将&i32转换为i32

它们不同的另一种方式是:范围不需要有一个包含所有元素的数组。所以也有这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接