【发布时间】: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