Cómo hacer referencia a un segmento mutable [duplicado]
Quiero actualizar un corte a través de una referencia mutable.
Si bien esto funciona con cortes inmutables:
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);
}
No funciona con mutables:
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);
}
Mensaje de error:
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
Sé que hay una manera de actualizar la porción devolviendo directamente una sublicencia.
Pero, ¿hay alguna manera de hacer posible la referenciación de un segmento mutable a través de una referencia mutable?
El problema es similar a este , pero no puedo imaginar qué lo hace tan diferente, esa solución propuesta no funciona.
Respuestas
No sé cuál es el problema con ese código, pero una opción sería devolver el segmento actualizado directamente:
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);
}
En lugar de actualizar a través de la referencia mutable, la actualización en la persona que llama deja en claro que el valor anterior de a_sliceno se usará más.