我希望您更新一个可变引用的切片。
尽管这对于不可变切片可以使用:
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
我知道有一种方式可以通过返回子切片来直接更新切片。
但是否有一种方法使得通过可变引用重新引用可变切片成为可能?
这个问题类似于这个问题,但我无法弄清楚是什么让它与其他问题不同,所以那个提出的解决方案不起作用。
catch_unwind
从恐慌中恢复,那么value
现在将指向一个空切片。这可能是不可取的,但我没有看到任何解决方法,至少在安全代码中是如此。 - trent