변경 가능한 슬라이스를 다시 참조하는 방법 [중복]

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더 이상 사용되지 않음을 분명히 알 수 있습니다.