首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新引用可变切片

如何重新引用可变切片
EN

Stack Overflow用户
提问于 2020-11-24 18:48:35
回答 1查看 205关注 0票数 3

我想通过一个可变的引用来升级一个切片。

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

代码语言:javascript
复制
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);
}

它不适用于可变类型:

代码语言:javascript
复制
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);
}

错误消息:

代码语言:javascript
复制
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类似,但我不明白是什么让它如此不同,以至于提出的解决方案不起作用。

EN

回答 1

Stack Overflow用户

发布于 2020-11-24 19:55:23

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

代码语言:javascript
复制
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的旧值将不再被使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64984856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档