Como referenciar novamente um slice mutável [duplicado]

Nov 24 2020

Quero atualizar um slice por meio de uma referência mutável.

Embora isso funcione com fatias imutáveis:

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

Não funciona com os mutáveis:

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

Mensagem de erro:

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

Eu sei que existe uma maneira de atualizar a fatia, retornando diretamente uma sub-fatia.

Mas existe uma maneira de tornar possível a nova referência de uma fatia mutável por meio de referência mutável?

O problema é semelhante a este , mas não consigo descobrir o que o torna tão diferente, a solução proposta não funciona.

Respostas

2 Douglas Nov 24 2020 at 18:55

Não sei qual é o problema com esse código, mas uma opção seria retornar a fatia atualizada diretamente:

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

Em vez de atualizar por meio da referência mutável, atualizar no chamador deixa claro que o valor antigo de a_slicenão será mais usado.