Day 3:引用與借用(不可變)
學習目標
- 理解「引用(reference)」與「借用(borrow)」概念
- 學會用不可變引用
& - 記住不可變引用的規則
今日重點
什麼是引用?
引用(&)讓你**借用**一個值而不取得所有權,用完自動還。
fn calculate_length(s: &String) -> usize {
s.len()
}
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("Length of '{}' is {}", s1, len); // s1 仍有效
}
不可變引用可以有很多個
let r1 = &s;
let r2 = &s;
let r3 = &s;
// 多個不可變引用同時存在 OK
引用的規則
- 任何時候,要嘛一個可變引用,要嘛多個不可變引用(不能混用)
- 引用必須永遠有效(不能有懸垂引用)
練習
fn main() {
let s = String::from("hello");
let r1 = &s;
let r2 = &s;
println!("{} and {}", r1, r2); // 兩個不可變引用 OK
// r1 和 r2 在最後一次使用後就「結束」
let r3 = &mut s; // 錯誤?試試看
println!("{}", r3);
}
上面想同時有不可變引用 r1/r2 再用之間的範圍做可變引用,會編譯失敗——這就是 Rust 防止資料競爭的方式。
自我檢查
- 能解釋借用(borrow)的意思
- 知道「多個不可變引用」可以共存
- 能說出引用規則(一可變或多多不可變、不可懸垂)
深入連結
- The Book 第 4 章「References and Borrowing」