0..3和[0,1,2]之间的差异.iter()

时间:2015-01-24 10:02:00

标签: rust

我可以为范围类型执行此操作:

(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>>();

为什么会这样?我认为这两者是做同样事情的另一种方式。

1 个答案:

答案 0 :(得分:11)

他们不是一回事。

这里的问题是对数组的iter的调用产生Iterator &i32个。为了处理每个可能的数组,它不能按值返回元素,因为并非所有类型都实现Copy,并且您无法部分移出数组。因此,为了收集到Vec<i32>,您必须通过复制将&i32转换为i32

其他方式与它们不相同:范围并不要求在某处包含所有元素的数组。所以也是如此。