Jak utworzyć odniesienie do zmiennego wycinka [duplikat]

Nov 24 2020

Chcę podnieść wycinek poprzez zmienne odniesienie.

Chociaż działa to z niezmiennymi plasterkami:

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);
}

Nie działa ze zmiennymi:

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);
}

Komunikat o błędzie:

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

Wiem, że istnieje sposób, aby zaktualizować wycinek, zwracając bezpośrednio podklaskę.

Ale czy istnieje sposób, aby umożliwić odwoływanie się do zmiennego wycinka poprzez zmienne odniesienie?

Problem jest podobny do tego , ale nie wiem, co sprawia, że ​​jest tak inny, że proponowane rozwiązanie nie działa.

Odpowiedzi

2 Douglas Nov 24 2020 at 18:55

Nie wiem, na czym polega problem z tym kodem, ale jedną z opcji byłoby bezpośrednie zwrócenie zaktualizowanego wycinka:

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);
}

Zamiast aktualizować przez zmienne odniesienie, aktualizacja w obiekcie wywołującym jasno pokazuje, że stara wartość a_slicenie będzie już używana.