ポインター/ref
ポインターについては、分配束縛と参照外しは異なる概念であり、C/C++ のような言語とは異なる使われ方をするため、区別する必要があります。
- 参照外しには
*を使用します - 分配束縛には
&、ref、ref 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); }, } }