邁向 Rust

借用與參考(borrowing and references)

如果把值傳入函式就會移動它、讓原本的變數不能用,那寫程式會很痛苦——每個想看看你 String 的函式都會把它吞掉。日常的解法是借用:你不交出所有權,而是讓函式透過一個參考來看你的值,等它看完,你仍然擁有那個值。這就像把一本書借給朋友讀、而不是送掉——他們可以用它,然後書回到你手上,而你仍是那個對它負責的擁有者。

參考是 Rust 對「受控指標」的稱呼:它是一個位址,讓不擁有某個值的程式碼也能讀取(有時也能寫入)它。你用 & 運算子建立它——&x 產生一個指向 x 的參考——而接收 &String 的函式拿到的是借用而非所有權,所以呼叫它並不會移動你的值。它有兩種口味。共享參考,寫作 &T,讓借用者能讀取值卻不能更改;你可以同時發出許多份共享參考,因為唯讀的共享是無害的。可變參考,寫作 &mut T,讓借用者能更改值,而 Rust 同一時間只允許一份。參考本身也受檢查:它必須永遠指向一個有效、仍存活的值,這正是 Rust 的參考比可能懸置的原始 C 指標更安全的原因。

為何重要:借用讓所有權變得可以過日子。沒有它,每次讀取一個值都會把它消耗掉;有了它,你保有所有權,只借出暫時的、經編譯器檢查的存取權。這和謹慎的 C 程式設計師在「取得所有權的指標(接收者必須釋放)」與「只是借用的指標(接收者不可釋放)」之間所劃的分別是同一回事——只是 Rust 把這個差別寫進了型別(&T 對比 T),並由編譯器強制執行。借用所附帶的那條最重要規則——許多份共享借用、或一份可變借用,絕不同時——重要到值得下一條獨立講。

fn len(s: &String) -> usize { // 借用,不取得所有權 s.len() } let name = String::from("ada"); let n = len(&name); // 借出一個參考 println!("{name} 有 {n} 個字元"); // name 在這裡仍然可用

傳入 &name 以借出該值;呼叫者保有所有權,之後仍可使用 name。

參考不是那個值,也不擁有它——它是借來的存取權,絕不能比它所指向的東西活得更久。借用永遠不會釋放值;只有擁有者會,在它的範圍結束時。

又稱
reference&T&mut T借用參考引用