共有参照

参照は、その値の所有権を取得することなく別の値にアクセスするための手段であり、「借用」とも呼ばれます。共有参照は読み取り専用で、参照されるデータは変更できません。

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let a = 'A';
    let b = 'B';

    let mut r: &char = &a;
    dbg!(r);

    r = &b;
    dbg!(r);
}

T への共有参照の型は &T です。参照値は & 演算子で作成します。* 演算子は参照を「デリファレンス」し、その値を取り出します。

  • Rust の参照が null になることは決してないため、null チェックは不要です。

  • 参照は、その参照先の値を「借用」すると表現されます。これはポインタに不慣れな受講者にとって有用なモデルです。コードは参照を使って値にアクセスできますが、その値は依然として元の変数に「所有」されています。このコースでは、3 日目に所有権についてさらに詳しく扱います。

  • 参照はポインタとして実装されており、重要な利点の 1 つは、参照先のものよりもはるかに小さくできることです。C や C++ に慣れた受講者は、参照をポインタとして認識するでしょう。コースの後半では、Rust が生ポインタの使用に起因するメモリ安全性のバグをどのように防ぐかを扱います。

  • & による明示的な参照化が必要です。ただし、メソッド呼び出し時は例外で、Rust が自動的に参照化とデリファレンスを行います。

  • Rust は一部の状況で自動デリファレンスを行います。特にメソッド呼び出し時がそうです(r.is_ascii() を試してください)。C++ のような -> 演算子は不要です。

  • この例では、r は再代入できるように可変になっています(r = &b)。これによって r は再束縛され、別のものを参照するようになります。これは、参照への代入が参照先の値を変更する C++ とは異なります。

  • 共有参照では、たとえ参照先の値が可変であっても、その値を変更することはできません。*r = 'X' を試してください。

  • Rust は、すべての参照のライフタイムを追跡して、それらが十分に長く生存することを保証します。ダングリング参照は safe Rust では発生しません。

  • 所有権を扱う際に、借用とダングリング参照の防止についてさらに詳しく説明します。