불변 변수에 대한 가변 참조를 얻습니까?

Aug 19 2020

이 코드 a는 불변으로 선언 되었기 때문에 에서 가변 참조를 얻을 수 없습니다 a. 그러나 이것은 컴파일되었습니다. 왜 그럴까요?

struct Foo;

fn main() {
    let a = &mut Foo;
    a.mut_ref();
}

impl Foo {
    fn mut_ref(&mut self) { }
}

코드 링크

답변

5 SvenMarnach Aug 19 2020 at 14:07

변수의 유형은 a입니다 &mut Foo. 즉, a그 자체가 Foo객체에 대한 변경 가능한 참조 입니다. 돌연변이 a는 다른 Foo객체를 가리 키도록 만드는 것을 의미 합니다. 그 a자체는 불변 이기 때문에 a가리키는 것을 변경할 수 없으며 코드가이를 반증하지 않습니다.

코드는 단순히 &mut Fooas self매개 변수를에 전달합니다 . mut_ref()유형 self&mut Foo입니다. 자동 a파생 이 발생하지 않습니다. 이미 self매개 변수에 대해 선택된 유형이 정확히 있습니다. 그러나 여기서 암시 적 재차 용을 트리거 하므로 호출은 Foo::mut_ref(&mut *a). 이 암시 적 재차 입은 코드를 작동하게 만드는 것이 아닙니다. 변경 가능한 참조를 외부로 이동하는 a것도 완벽하게 허용됩니다.

a는 변수로 변경 불가능 하지만 여전히 변경 가능한 참조이므로 Foo가리키는 객체 를 변경할 수 있습니다 (변경할 Foo상태가 있다고 가정 ). 에 대한 변경 가능한 참조를 가져올 수 없으며 a유형이 있어야합니다 &mut &mut Foo.