如何重新引用可变切片

3

我希望您更新一个可变引用的切片。

尽管这对于不可变切片可以使用:

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

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

但是否有一种方法使得通过可变引用重新引用可变切片成为可能?

这个问题类似于这个问题,但我无法弄清楚是什么让它与其他问题不同,所以那个提出的解决方案不起作用。


2
重复 适用于您的情况 - trent
如果索引出现错误,并且您使用catch_unwind从恐慌中恢复,那么value现在将指向一个空切片。这可能是不可取的,但我没有看到任何解决方法,至少在安全代码中是如此。 - trent
谢谢 @trentcl 再次澄清: ) 你的建议正是我所需要的。 - huh-hulk
1个回答

2

我不知道那段代码有什么问题,但是一个选项是直接返回更新后的切片:

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 的旧值不再使用。

就像我说的那样,我知道可以通过返回子切片来重新分配切片,但这并不是我需要的。谢谢你的建议:) - huh-hulk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接