ポインタとref

Rustのポインタは、C/C++のポインタとは異なる概念なので、デストラクトとデリファレンスを同じようなやり方で扱うことはできません。

  • デリファレンスには*を用います。
  • デストラクトには&, ref, ref mutを用います。
fn main() {
    // `i32`型への参照を代入します。
    // `&`によって参照であることを明示しています。
    let reference = &4;

    match reference {
        // 上で定義した`reference`という変数が`&val`とのパターンマッチ
        // に用いられた場合、以下の2つの値が比較されていることになります。
        // `&i32`
        // `&val`
        // ^ よって`&`を落とせば、`i32`が`val`に代入されることがわかります。
        &val => println!("Got a value via destructuring: {:?}", val),
    }

    // `&`を使用したくない場合は、マッチングの前にデリファレンスします。
    match *reference {
        val => println!("Got a value via dereferencing: {:?}", val),
    }

    // いきなり参照を変数に代入するのではない場合はどうでしょう。
    // 先ほどは右辺値が`&`で始まっていたので参照でしたが、
    // これは違います。
    let _not_a_reference = 3;

    // このような場合、Rustでは変数束縛時に`ref`を宣言します。
    // 要素の参照が作られて、それが束縛対象になります。
    let ref _is_a_reference = 3;

    // 同様にミュータブルな値の場合`ref mut`を使用することで参照を
    // 取得できます。イミュータブルの場合と合わせてみていきましょう。
    let value = 5;
    let mut mut_value = 6;

    // `ref`を使用して参照を作成。
    match value {
        ref r => println!("Got a reference to a value: {:?}", r),
    }

    // 同様に`ref mut`を使用。
    match mut_value {
        ref mut m => {
            // 参照を取得、値を変更するためにはデリファレンスします。
            *m += 10;
            println!("We added 10. `mut_value`: {:?}", m);
        },
    }
}

参照

ref パターン