Vec <struct>和&amp; [struct]之间有什么区别?</struct>

时间:2014-12-18 20:09:32

标签: vector data-structures rust

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

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

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

他们之间有什么不同?是否与String&str相同?

1 个答案:

答案 0 :(得分:6)

  

是否与String&str相同?

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

  

&[u8]并将其设为Vec

对于此特定情况

let s: &[u8]; // Set this somewhere
Vec::from(s);

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

  

反之亦然

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

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