我经常发现自己会犯这样的错误:

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]是在存储器中顺序排列的referenceT的集合(又称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 进行切片.

Rust相关问答推荐

为什么导入Borrow将借入的呼叫改为Borrow::borrow而不是RefCell::borrow

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

有没有办法模仿对象安全克隆?

如何在Tauri中将变量从后端传递到前端

为什么';t std::cell::ref使用引用而不是非空?

如果死 struct 实现了/派生了一些特征,为什么Rust会停止检测它们?

从未排序的链表中删除重复项的铁 rust 代码在ELSE分支的低级上做了什么?

不同类型泛型的映射

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

如何迭代存储在 struct 中的字符串向量而不移动它们?

需要哪些编译器优化来优化此递归调用?

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

为什么需要同时为值和引用实现`From`?方法不应该自动解引用或borrow 吗?(2023-06-16)

我如何取消转义,在 Rust 中多次转义的字符串?

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

按下 Ctrl + C 时优雅地停止命令并退出进程

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

如何为返回正确类型的枚举实现 get 方法?

为什么我不能为 Display+Debug 的泛型类型实现 std::error::Error 但有一个不是泛型参数的类型?