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

引用的規則

  1. 任何時候,要嘛一個可變引用,要嘛多個不可變引用(不能混用)
  2. 引用必須永遠有效(不能有懸垂引用)

練習

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」