エイリアシング
データは何度でも不変に借用できますが、不変に借用されている間は、 元のデータを可変に借用することはできません。一方で、一度に許可される 可変借用は 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); }