エイリアス
データは一度にいくつでもイミュータブルに借用することができますが、その間オリジナルのデータをミュータブルに借用することはできません。一方でミュータブルな借用は一度に 一つ しか借用することができません。オリジナルのデータをもう一度借用できるのはミュータブルな参照が最後に使われた場所より あとで なければいけません。
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 ^ この行をアンコメントしてみましょう。
// 借用された値はここで再び利用されます。
println!("Point has coordinates: ({}, {}, {})",
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!`はイミュータブルな参照を取るため、printできません。
// println!("Point Z coordinate is {}", point.z);
// TODO ^ この行をアンコメントしてみましょう。
// OK!ミュータブルな参照は`println!`にイミュータブルな参照として渡せます。
println!("Point has coordinates: ({}, {}, {})",
mutable_borrow.x, mutable_borrow.y, mutable_borrow.z);
// ミュータブルな参照がこれ以降のコードで未使用なので、再借用できます。
let new_borrowed_point = &point;
println!("Point now has coordinates: ({}, {}, {})",
new_borrowed_point.x, new_borrowed_point.y, new_borrowed_point.z);
}