是否可以通过可变引用“推进”可变切片?

Jac*_*nor 6 slice rust

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

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

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

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

第二个例子给出了这个错误:

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`
Run Code Online (Sandbox Code Playgroud)

这是借用检查器的限制,还是我在这里尝试做的事情实际上是不合理的?有解决方法吗?

pig*_*nds 6

您可以使用std::mem::take来解决这个问题。

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