我经常用共享的切片做这样的事情:

fn read_a_few_bytes(slice: &mut &[u8]) {
    dbg!(&slice[..3]);
    *slice = &slice[3..];
}

今天,我注意到,当切片可变时,这种方法不起作用:

fn read_a_few_bytes(slice: &mut &mut [u8]) {
    dbg!(&slice[..3]);
    *slice = &mut slice[3..];
}

第二个示例显示以下错误:

error: lifetime may not live long enough
 --> src/main.rs:3:5
  |
1 | fn read_a_few_bytes(slice: &mut &mut [u8]) {
  |                            -    - let's call the lifetime of this reference `'2`
  |                            |
  |                            let's call the lifetime of this reference `'1`
2 |     dbg!(&slice[..3]);
3 |     *slice = &mut slice[3..];
  |     ^^^^^^^^^^^^^^^^^^^^^^^^ assignment requires that `'1` must outlive `'2`

这是borrow 判断器的限制,还是有某种方式让我在这里try 做的事情实际上是不可靠的?有解决办法吗?

推荐答案

你可以用std::mem::take来解决这个问题.

fn read_a_few_bytes(slice: &mut &mut [u8]) {
    let data = std::mem::take(slice);
    *slice = &mut data[3..];
}

Rust相关问答推荐

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

把Vector3变成Vector4的绝妙方法

如何访问Rust存储值的内存地址

闭包不会发送,即使它只捕获发送变量

告诉Rust编译器返回值不包含构造函数中提供的引用

为什么我们需要std::thread::scope,如果我们可以使用thread.join()在函数的生命周期内删除引用?

铁 rust ,我的模块介绍突然遇到了一个问题

失真图像图形捕获Api

习语选项<;T>;到选项<;U>;当T->;U用From定义

类型生命周期绑定的目的是什么?

我可以解构self 参数吗?

详尽的匹配模式绑定

如何处理闭包中的生命周期以及作为参数和返回类型的闭包?

如何正确使用git2::Remote::push?

Rust并发读写引起的死锁问题

Rust编译器通过哪些规则来确保锁被释放?

如何在 Rust 中显式声明 std::str::Matches<'a, P> ?

为什么 Rust 的临时值有时有参考性有时没有?

如何限制通用 const 参数中允许的值?

Rust 引用元组和引用元组