Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

エイリアシング

データは何度でも不変に借用できますが、不変に借用されている間は、 元のデータを可変に借用することはできません。一方で、一度に許可される 可変借用は 1つ だけです。元のデータは、可変参照が最後に使用された にのみ、再び借用できます。

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 の座標は: ({}, {}, {})",
                borrowed_point.x, another_borrow.y, point.z);

    // エラー!`point` は現在不変として借用されているため、
    // 可変として借用できません。
    // let mutable_borrow = &mut point;
    // TODO ^ この行のコメントを外してみてください

    // 借用された値はここでもう一度使用されます
    println!("Point の座標は: ({}, {}, {})",
                borrowed_point.x, another_borrow.y, point.z);

    // 不変参照は以降のコードではもう使用されないため、
    // 可変参照で再借用できます。
    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 座標は {}", point.z);
    // TODO ^ この行のコメントを外してみてください

    // OK!可変参照は不変参照として `println!` に渡すことができます
    println!("Point の座標は: ({}, {}, {})",
                mutable_borrow.x, mutable_borrow.y, mutable_borrow.z);

    // 可変参照は以降のコードではもう使用されないため、
    // 再借用できます
    let new_borrowed_point = &point;
    println!("Point の現在の座標は: ({}, {}, {})",
             new_borrowed_point.x, new_borrowed_point.y, new_borrowed_point.z);
}