변경 가능한 슬라이스를 다시 참조하는 방법 [중복]
Nov 24 2020
가변 참조를 통해 슬라이스를 업데이트하고 싶습니다.
이것은 불변 슬라이스에서 작동하지만 :
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);
}
변경 가능한 항목에서는 작동하지 않습니다.
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);
}
에러 메시지:
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
서브 슬라이스를 직접 반환하여 슬라이스를 업데이트하는 방법이 있다는 것을 알고 있습니다.
그러나 가변 참조를 통해 가변 슬라이스를 참조하는 방법이 있습니까?
문제는 유사하다 이 하나 ,하지만 제안 된 솔루션이 일을하지 않는, 그렇게 다른 점은 무엇인지 알아낼 수 없습니다.
답변
2 Douglas Nov 24 2020 at 18:55
해당 코드의 문제가 무엇인지 모르겠지만 한 가지 옵션은 업데이트 된 슬라이스를 직접 반환하는 것입니다.
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);
}
변경 가능한 참조를 통해 업데이트하는 대신 호출자에서 업데이트하면의 이전 값이 a_slice
더 이상 사용되지 않음을 분명히 알 수 있습니다.