13.3.3 Aliasing
데이터의 비가변성 대여는 몇 번이고 가능하지만, 비가변성 대여 시 원본 데이터는 가변대여가 불가능하다. 다르게 말하자면, 한 번에 오직 하나의 가변 대여만 허용된다. 원본 데이터는 오직 가변 대여가 범위에서 사라진 후에만 다시 대여될 수 있다.
struct Point { x: i32, y: i32, z: i32 }
fn main() {
let mut point = Point { x: 0, y: 0, z: 0 };
{
let borrowed_point = &point;
let another_borrow = &point;
// 데이터는 참조나 원본 소유자를 통해 접근될 수 있다.
println!("Point has coordinates: ({}, {}, {})",
borrowed_point.x, another_borrow.y, point.z);
// 에러! point를 가변성 대여가 불가한 이유는
// 현재 불가변성 대여되었기 때문이다.
//let mutable_borrow = &mut point;
// TODO ^ 해당 라인의 주석을 제거해보세요.
// 불가변성 참조가 범위에서 사라진다.
}
{
let mutable_borrow = &mut point;
// 가변성 참조를 통해 데이터를 변경
mutable_borrow.x = 5;
mutable_borrow.y = 2;
mutable_borrow.z = 1;
// 에러! `point`의 불가변성 대여를 할 수 없는 이유는
// 현재 가변성 대여가 되어 있는 상태이기 때문이다.
//let y = &point.y;
// TODO ^ 해당 라인의 주석을 제거해보세요.
// 에러! `println!`을 통해 출력할 수 없는 이유는 불가변 참조를 취하기 때문이다.
//println!("Point Z coordinate is {}", point.z);
// TODO ^ 해당 라인의 주석을 제거해보세요.
// 좋다! 가변 참조는 불가변성으로 `println!`에 전달될 수 있다.
println!("Point has coordinates: ({}, {}, {})",
mutable_borrow.x, mutable_borrow.y, mutable_borrow.z);
// 가변성 참조가 범위에서 사라진다.
}
// point에 대한 불가변성 대여를 다시 허용한다.
let borrowed_point = &point;
println!("Point now has coordinates: ({}, {}, {})",
borrowed_point.x, borrowed_point.y, borrowed_point.z);
}