rust - 如何引用可变切片

标签 rust lifetime borrow-checker

<分区>

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

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

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 ,但我不明白是什么让它如此不同,所提出的解决方案不起作用。

最佳答案

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

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

关于rust - 如何引用可变切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64984856/

相关文章:

Rust 指定局部变量的生命周期

rust - 产生任务时的生命周期错误

rust - 向函数添加内存时借用检查器提示

json - 以不同的格式反序列化 JSON - Serde_JSON

rust - 为什么不能在结构定义中省略生命周期?

rust - 使用 Tokio 的 mpsc 和 oneshot 会导致死锁

rust - Option<&T> 如何实现复制

rust - 在惯用 Rust 中实现容器元素关系的正确方法

closures - 闭包的类型别名

database - diesel需要安装mysql和sqlite吗?