Como referenciar novamente um slice mutável [duplicado]
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
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_slice
não será mais usado.