0..3 和 [0, 1, 2].iter() 的区别
Differences between 0..3 and [0, 1, 2].iter()
我可以为范围类型执行此操作:
(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>>();
为什么会这样?我以为这两者是做同一件事的不同方式。
它们不是一回事。
这里的问题是对数组 iter
的调用产生了 &i32
的 Iterator
。为了处理每个可能的数组,它不能按值 return 元素,因为并非所有类型都实现 Copy
并且您不能部分移出数组。因此,为了收集到 Vec<i32>
,您必须通过复制将 &i32
变成 i32
。
other 它们的不同之处在于:范围不要求某处存在包含所有元素的数组。所以还有那个。
我可以为范围类型执行此操作:
(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>>();
为什么会这样?我以为这两者是做同一件事的不同方式。
它们不是一回事。
这里的问题是对数组 iter
的调用产生了 &i32
的 Iterator
。为了处理每个可能的数组,它不能按值 return 元素,因为并非所有类型都实现 Copy
并且您不能部分移出数组。因此,为了收集到 Vec<i32>
,您必须通过复制将 &i32
变成 i32
。
other 它们的不同之处在于:范围不要求某处存在包含所有元素的数组。所以还有那个。