我想通过一个可变的引用来升级一个切片。
虽然这确实适用于不可变的切片:
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类似,但我不明白是什么让它如此不同,以至于提出的解决方案不起作用。
发布于 2020-11-24 19:55:23
我不知道这段代码有什么问题,但一种选择是直接返回更新后的切片:
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的旧值将不再被使用。
https://stackoverflow.com/questions/64984856
复制相似问题