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

results matching ""

    No results matching ""