我经常发现自己收到这样的错误:
mismatched types: expected `collections::vec::Vec<u8>`, found `&[u8]` (expected struct collections::vec::Vec, found &-ptr)
据我所知,一个是可变的,一个不是,但我不知道如何在两种类型之间进行,即取&[u8]
并使其成为Vec<u8>
,反之亦然
他们之间有什么不同?是否与String
和&str
相同?
答案 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在有意义时尝试采用切片的原因。