Jak utworzyć odniesienie do zmiennego wycinka [duplikat]
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
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_slice
nie będzie już używana.