불변 변수에 대한 가변 참조를 얻습니까?
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 Foo
as self
매개 변수를에 전달합니다 . mut_ref()
유형 self
도 &mut Foo
입니다. 자동 a
파생 이 발생하지 않습니다. 이미 self
매개 변수에 대해 선택된 유형이 정확히 있습니다. 그러나 여기서 암시 적 재차 용을 트리거 하므로 호출은 Foo::mut_ref(&mut *a)
. 이 암시 적 재차 입은 코드를 작동하게 만드는 것이 아닙니다. 변경 가능한 참조를 외부로 이동하는 a
것도 완벽하게 허용됩니다.
a
는 변수로 변경 불가능 하지만 여전히 변경 가능한 참조이므로 Foo
가리키는 객체 를 변경할 수 있습니다 (변경할 Foo
상태가 있다고 가정 ). 에 대한 변경 가능한 참조를 가져올 수 없으며 a
유형이 있어야합니다 &mut &mut Foo
.