我经常发现自己收到这样的错误:
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 在有意义时尝试获取切片的原因。