Vec<struct>和&[struct]有什么区别?

13

我经常发现自己会遇到这样的错误:

mismatched types: expected `collections::vec::Vec<u8>`, found `&[u8]` (expected struct collections::vec::Vec, found &-ptr)
据我所知,一个可变而另一个不可变,但我不知道如何在它们之间转换类型,例如:将&[u8]转换为Vec<u8>或反之亦然。
它们有什么不同?与String&str的区别相同吗?
1个回答

11
这是与String&str相同的。 Vec<T>&[T]的所有权变体。 &[T]是一组按顺序排列在内存中的T的引用(也称为切片)。它代表指向项目开头和项目数量的指针。引用是指您不拥有的东西,因此您可以使用它执行的操作集受到限制。还有一个可变的变体(&mut [T]),它允许您修改切片中的项目。但是,您无法更改切片中的项目数。换句话说,您不能修改切片本身。
对于这种特定情况,将&[u8]转换为Vec
let s: &[u8]; // Set this somewhere
Vec::from(s);

然而,这种方法需要在堆上分配内存,然后复制每个值到该内存中。虽然相对来说更加耗费资源,但在某些情况下可能是正确的做法。

或者反之亦然。

let v = vec![1u8, 2, 3];
let s = v.as_slice();

基本上,这是“免费”的,因为v仍然拥有数据,我们只是提供了一个对它的引用。这就是为什么许多API在有意义的情况下尝试使用切片的原因。


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