【问题标题】:How to rereference a mutable slice [duplicate]如何引用可变切片[重复]
【发布时间】:2021-03-07 03:19:33
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • (如果索引出现恐慌,并且您使用catch_unwind 从恐慌中恢复,value 现在将指向一个空切片。这可能是不可取的,但我看不到解决办法它,至少不在安全代码中。)
  • 感谢您再次澄清@trentcl :) 您的建议正是我所需要的。

标签: rust lifetime borrow-checker


【解决方案1】:

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

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

【讨论】:

  • 正如我所说,我知道可以通过返回子切片来重新分配切片,但这并不是我所需要的。谢谢你的建议:)
猜你喜欢
  • 2015-03-08
  • 2020-07-28
  • 2019-05-23
  • 2011-07-14
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2016-10-15
相关资源
最近更新 更多