共有参照

A reference provides a way to access another value without taking ownership of the value, and is also called "borrowing". Shared references are read-only, and the referenced data cannot change.

fn main() {
    let a = 'A';
    let b = 'B';
    let mut r: &char = &a;
    println!("r: {}", *r);
    r = &b;
    println!("r: {}", *r);
}

T への共有参照の型は &T です。参照値は & 演算子で作成されます。* 演算子は参照を「逆参照」し、その値を生成します。

Rust はダングリング参照を静的に禁止します。

fn x_axis(x: &i32) -> &(i32, i32) {
    let point = (*x, 0);
    return &point;
}
This slide should take about 10 minutes.
  • References can never be null in Rust, so null checking is not necessary.

  • 参照とは、参照する値を「借用する」ことだと言われていますが、これはポインタに慣れていない受講者にとって理解しやすい説明です。コードでは参照を使用して値にアクセスできますが、その値は元の変数によって「所有」されたままとなります。所有については、コースの 3 日目で詳しく説明します。

  • 参照はポインタとして実装されます。主な利点は、参照先よりもはるかに小さくできることです。C または C++ に精通している受講者は、参照をポインタとして認識できます。このコースの後半で、未加工ポインタの使用によるメモリ安全性のバグを Rust で防止する方法について説明します。

  • Rust は参照を自動的に作成しないため、常に & を付ける必要があります。

  • Rust will auto-dereference in some cases, in particular when invoking methods (try r.is_ascii()). There is no need for an -> operator like in C++.

  • この例では、r は可変であるため、再代入が可能です(r = &b)。これにより r が再バインドされ、他の値を参照するようになります。これは、参照に代入すると参照先の値が変更される C++ とは異なります。

  • 共有参照では、値が可変であっても、参照先の値は変更できません。*r = 'X' と指定してみてください。

  • Rust は、すべての参照のライフタイムを追跡して、十分な存続期間を確保しています。安全な Rust では、ダングリング参照が発生することはありません。x_axispoint への参照を返しますが、関数が戻ると point の割り当てが解除されるため、コンパイルされません。

  • 借用については所有権のところで詳しく説明します。