我试图简单地将切片转换为矢量。以下代码:
let a = &[0u8];
let b: Vec<u8> = a.iter().collect();
失败,出现以下错误消息:
3 | let b: Vec<u8> = a.iter().collect();
| ^^^^^^^ a collection of type `std::vec::Vec<u8>` cannot be built from an iterator over elements of type `&u8`
我错过了什么?
迭代器只返回对元素的引用(这里是&u8
)。要获得自有值(此处为u8
),您可以使用.cloned()
。
let a: &[u8] = &[0u8];
let b: Vec<u8> = a.iter().cloned().collect();
收集到Vec
是如此常见,切片有一个方法to_vec
正是这样做:
let b = a.to_vec();
你得到与CodesInChaos's answer相同的东西,但更简洁。
请注意,to_vec
需要T: Clone
。要从Vec<T>
中获得&[T]
,你必须能够从一个非拥有的T
获得一个拥有的&T
,这就是Clone
所做的。
Slices also implement ToOwned
,所以你可以使用to_owned
而不是to_vec
,如果你想在不同类型的非拥有容器上使用它。如果您的代码仅适用于切片,请选择to_vec
。