共用列舉

所謂參照,是一種可存取另一值而不對該值負責的方法,也稱為「借用 (borrowing)」。共用的參照僅供唯讀,且其參照的資料無法變更。

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.
  • 參照可說是「借用」自身參照的值,對不熟悉指標的學生而言,這是不錯的模型,因為程式碼可以使用參照來存取值,但仍歸原始的變數所「擁有」。本課程將在第 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++ 不同,在 C++ 中,對參照的賦值會變更參照的值。

  • 共用參照不允許修改其參照的值,即使該值可變動也一樣。請嘗試使用 *r = 'X'

  • Rust 會追蹤所有參照的生命週期,確保其存留時間夠長。在安全的 Rust 中不會發生迷途參照。x_axis 會傳回對 point 的參照,但在函式傳回時會釋放 point ,因此不會編譯。

  • 我們會在講到擁有權時進一步探討「借用」。