可変スライスを再参照する方法[複製]

Nov 24 2020

可変参照を介してスライスを更新したいと思います。

これは不変のスライスでは機能しますが、次のようになります。

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

サブスライスを直接返すことでスライスを更新する方法があることを私は知っています。

しかし、可変参照を介して可変スライスを再参照できるようにする方法はありますか?

問題は、に似ているこの1提案された解決策は仕事をしないことを、私はそれがとても違うものを把握することはできません。

回答

2 Douglas Nov 24 2020 at 18:55

そのコードの問題が何であるかはわかりませんが、1つのオプションは、更新されたスライスを直接返すことです。

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が使用されなくなることが明確になります。