首页 > 解决方案 > 如何重新引用可变切片

问题描述

我想通过可变引用更新切片。

虽然这确实适用于不可变切片:

fn shrink(value: &mut &[u8]) {
    *value = &value[0..2];
}

fn main() {
    let a = [0; 4];
    let mut a_slice: &[u8] = &a;
    shrink(&mut a_slice);
    println!("{:?}", a_slice);
}

它不适用于可变的:

fn shrink<'a: 'b, 'b>(value: &'a mut &'b mut [u8]) {
    *value = &mut value[0..2];
}

fn main() {
    let mut a = [0; 4];
    let mut a_slice: &mut [u8] = &mut a;
    shrink(&mut a_slice);
    println!("{:?}", a_slice);
}

错误信息:

error[E0502]: cannot borrow `a_slice` as immutable because it is also borrowed as mutable
 --> src/main.rs:8:22
  |
7 |     shrink(&mut a_slice);
  |            ------------ mutable borrow occurs here
8 |     println!("{:?}", a_slice);
  |                      ^^^^^^^
  |                      |
  |                      immutable borrow occurs here
  |                      mutable borrow later used here

我知道有一种方法可以通过直接返回子切片来更新切片。

但是有没有办法通过可变引用重新引用可变切片成为可能?

这个问题类似于这个问题,但我不知道是什么让它如此不同,建议的解决方案不起作用。

标签: rustlifetimeborrow-checker

解决方案


我不知道该代码有什么问题,但一种选择是直接返回更新后的切片:

fn shrink(value: &mut [u8]) -> &mut [u8] {
    &mut value[0..2]
}

fn main() {
    let mut a = [0; 4];
    let mut a_slice = &mut a[..];
    a_slice = shrink(a_slice);
    println!("{:?}", a_slice);
}

调用者中的更新不是通过可变引用进行更新,而是清楚地表明a_slice不再使用旧值。


推荐阅读