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();