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); }