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

les*_*how 6 vector rust data-structures

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

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

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

他们之间有什么不同?是不是一样String和&str?

She*_*ter 6

是不是一样String和&str?

是.A Vec<T>是a的拥有变体&[T].&[T]是对T在存储器(也称为切片)中顺序布局的一组s 的引用.它表示指向项目开头和项目数的指针.引用是指您不拥有的内容,因此您可以使用它执行的操作集是有限的.有一个mutable variant(&mut [T]),它允许你改变切片中的项目.但是,您无法更改切片中的数量.换句话说,你不能改变切片本身.

拿一个,&[u8]然后做一个Vec

对于这个特定情况:

let s: &[u8]; // Set this somewhere
Vec::from(s);
Run Code Online (Sandbox Code Playgroud)

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

或相反亦然

let v = vec![1u8, 2, 3];
let s = v.as_slice();
Run Code Online (Sandbox Code Playgroud)

这基本上是"免费的",因为v仍然拥有数据,我们只是分发它的引用.这就是为什么许多API在有意义时尝试采用切片的原因.