Rust 從基礎到精通 — 第 3 講
將所有權、借用和切片與程式碼連接起來
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
Rust 中的所有權是一條在編譯時決定誰清理記憶體的規則。 在函數類型中指示該值是否將被移動、唯讀或可變。
移動值
fn print_name(name: String) {
println!("{name}");
}
let player_name = String::from("Rose");
print_name(player_name);
//此處不能再使用player_name。
String 擁有堆數據,因此在分配或傳遞值時所有權會發生變化。 為了保持原件有效,您必須明確複製或引用它。
不可變和可變引用
fn print_name(name: &str) {
println!("{name}");
}
fn add_suffix(name: &mut String) {
name.push_str("_01");
}
let mut player_name = String::from("Rose");
print_name(&player_name);
add_suffix(&mut player_name);
簡單借用 &str 來讀取字串內容,借用 &mut String 來更改值。 您不能在同一範圍內同時使用一個可變引用和另一個引用。
此限制可防止讀取值時發生變更或同時在兩個位置進行修改的情況。
切片
fn first_word(text: &str) -> &str {
match text.find(' ') {
Some(index) => &text[..index],
None => text,
}
}
切片是對字串或陣列的連續部分的引用,但不擁有它。 不需要整個字串的函數可以透過接收 &str 來使用字串文字和字串切片。
參考的生命週期
編譯器確保引用的壽命不會超過原始引用的壽命。 如果您嘗試傳回函數外部局部變數的引用,它將無法編譯,因為原始變數首先消失。
當遇到所有權錯誤時,您應該首先確定該值的實際所有者應該是誰,而不是首先克隆它。 借用是一種避免複製的技術,同時也是一種限制打字存取權的合約。