我经常发现自己会犯这样的错误:
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]
是在存储器中顺序排列的reference到T
的集合(又称slice).它表示指向项目开头和项目数的指针.引用指的是你不拥有的东西,所以你可以用它做的一系列动作是有限的.有一个可变变体(&mut [T]
),它允许您对切片中的项目进行变异.但你不能改变切片中的数量.换句话说,你不能改变切片本身.
拿
&[u8]
分做Vec
分
this specific case美元:
let s: &[u8]; // Set this somewhere
Vec::from(s);
然而,这必须分配不在堆栈上的内存,然后将每个值copy分配到该内存中.这比另一种方式更昂贵,但对于特定情况来说可能是正确的 Select .
反之亦然
let v = vec![1u8, 2, 3];
let s = v.as_slice();
这基本上是"免费"的,因为v
仍然拥有这些数据,我们只是分发一个参考.这就是为什么许多API在有意义的时候会try 进行切片.