我经常发现自己会遇到这样的错误:
mismatched types: expected `collections::vec::Vec<u8>`, found `&[u8]` (expected struct collections::vec::Vec, found &-ptr)
据我所知,一个可变而另一个不可变,但我不知道如何在它们之间转换类型,例如:将&[u8]
转换为Vec<u8>
或反之亦然。它们有什么不同?与
String
和&str
的区别相同吗?我经常发现自己会遇到这样的错误:
mismatched types: expected `collections::vec::Vec<u8>`, found `&[u8]` (expected struct collections::vec::Vec, found &-ptr)
据我所知,一个可变而另一个不可变,但我不知道如何在它们之间转换类型,例如:将&[u8]
转换为Vec<u8>
或反之亦然。String
和&str
的区别相同吗?String
和&str
相同的。 Vec<T>
是&[T]
的所有权变体。 &[T]
是一组按顺序排列在内存中的T
的引用(也称为切片)。它代表指向项目开头和项目数量的指针。引用是指您不拥有的东西,因此您可以使用它执行的操作集受到限制。还有一个可变的变体(&mut [T]
),它允许您修改切片中的项目。但是,您无法更改切片中的项目数。换句话说,您不能修改切片本身。&[u8]
转换为Vec
:let s: &[u8]; // Set this somewhere
Vec::from(s);
然而,这种方法需要在堆上分配内存,然后复制每个值到该内存中。虽然相对来说更加耗费资源,但在某些情况下可能是正确的做法。
或者反之亦然。
let v = vec![1u8, 2, 3];
let s = v.as_slice();
基本上,这是“免费”的,因为v
仍然拥有数据,我们只是提供了一个对它的引用。这就是为什么许多API在有意义的情况下尝试使用切片的原因。