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

ポインター/ref

ポインターについては、分配束縛と参照外しは異なる概念であり、C/C++ のような言語とは異なる使われ方をするため、区別する必要があります。

  • 参照外しには * を使用します
  • 分配束縛には &refref mut を使用します
fn main() {
    // `i32` 型の参照を代入します。`&` は、参照が代入されている
    // ことを示します。
    let reference = &4;

    match reference {
        // `reference` が `&val` に対してパターンマッチされると、
        // 次のような比較になります:
        // `&i32`
        // `&val`
        // ^ マッチする `&` を取り除くと、`i32` が `val` に
        // 代入されるべきであることがわかります。
        &val => println!("分配束縛によって値を取得しました: {:?}", val),
    }

    // `&` を避けるには、マッチする前に参照外しします。
    match *reference {
        val => println!("参照外しによって値を取得しました: {:?}", val),
    }

    // 参照から始めない場合はどうなるでしょうか?`reference` が `&` だったのは、
    // 右辺がすでに参照だったためです。これは右辺が参照ではないため、
    // 参照ではありません。
    let _not_a_reference = 3;

    // Rust はまさにこの目的のために `ref` を提供しています。これは代入を
    // 変更し、その要素への参照が作成されるようにします。そしてこの
    // 参照が代入されます。
    let ref _is_a_reference = 3;

    // したがって、参照を持たない 2 つの値を定義することで、
    // `ref` と `ref mut` によって参照を取得できます。
    let value = 5;
    let mut mut_value = 6;

    // `ref` キーワードを使用して参照を作成します。
    match value {
        ref r => println!("値への参照を取得しました: {:?}", r),
    }

    // `ref mut` も同様に使用します。
    match mut_value {
        ref mut m => {
            // 参照を取得しました。何かを加算する前に
            // 参照外しする必要があります。
            *m += 10;
            println!("10 を加算しました。`mut_value`: {:?}", m);
        },
    }
}

関連項目:

ref パターン