共用列舉
所謂參照,是一種可存取另一值而不對該值負責的方法,也稱為「借用 (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
,因此不會編譯。 -
我們會在講到擁有權時進一步探討「借用」。