エイリアス - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## 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

# エイリアス

データは一度にいくつでもイミュータブルに借用することができますが、その間オリジナルのデータをミュータブルに借用することはできません。一方でミュータブルな借用は一度に 一つ しか借用することができません。オリジナルのデータをもう一度借用できるのはミュータブルな参照が最後に使われた場所より あとで なければいけません。

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