Vector Vec<;结构>;及;[struct]?

Vector Vec<;结构>;及;[struct]?,vector,data-structures,rust,Vector,Data Structures,Rust,我经常发现自己会犯这样的错误: mismatched types: expected `collections::vec::Vec<u8>`, found `&[u8]` (expected struct collections::vec::Vec, found &-ptr) 不匹配的类型:应为'collections::vec::vec',found`&[u8]`(应为struct collections::vec::vec,found&-ptr) 据我所知,一

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

mismatched types: expected `collections::vec::Vec<u8>`, found `&[u8]` (expected struct collections::vec::Vec, found &-ptr)
不匹配的类型:应为'collections::vec::vec',found`&[u8]`(应为struct collections::vec::vec,found&-ptr)
据我所知,一个是可变的,一个不是可变的,但我不知道如何在两种类型之间切换,即取一个
&[u8]
并将其设为
Vec
,反之亦然

他们之间有什么不同?它与
String
&str
相同吗

它与
String
&str
相同吗

对。
Vec
和[T]
的自有变体
&[T]
是对内存中按顺序排列的一组
T
s的引用(也称为片)。它表示指向项目开头和项目数的指针。引用指的是您不拥有的东西,因此您可以使用它执行的操作集是有限的。有一个可变变量(
&mut[T]
),允许您对切片中的项目进行变异。但是,您无法更改切片中的数量。换句话说,你不能改变切片本身

取一个
&[u8]
并使其成为一个
Vec

对于这一具体情况:

但是,这必须分配不在堆栈上的内存,然后将每个值复制到该内存中。这比另一种方式更昂贵,但对于特定的情况可能是正确的

反之亦然

这基本上是“免费”的,因为
v
仍然拥有数据,我们只是分发一个对它的引用。这就是为什么许多API在有意义的时候会尝试进行切片

let s: &[u8]; // Set this somewhere
Vec::from(s);
let v = vec![1u8, 2, 3];
let s = v.as_slice();