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



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

mismatched types: expected `collections::vec::Vec<u8>`, found `&[u8]` (expected struct collections::vec::Vec, found &-ptr)

据我所知,一个是可变的,一个不是,但我不知道如何在类型之间切换,即取一个&[u8]并使其成为Vec<u8>,反之亦然。

它们之间有什么区别?和String&str一样吗?

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 在有意义时尝试获取切片的原因。

最新更新