借用

Rust's borrow checker puts constraints on the ways you can borrow values. For a given value, at any time:

  • You can have one or more shared references to the value, or
  • You can have exactly one exclusive reference to the value.
fn main() {
    let mut a: i32 = 10;
    let b: &i32 = &a;

    {
        let c: &mut i32 = &mut a;
        *c = 20;
    }

    println!("a: {a}");
    println!("b: {b}");
}
This slide should take about 10 minutes.
  • 請注意,這裡的規定是同一點上不得「存在」衝突的參照,在何處解除參照並不重要。
  • 上述程式碼不會編譯,因為系統會同時透過 cb,以可變動項和不可變動項的格式借用 a
  • 請將 bprintln! 陳述式移到導入 c 的範圍前,即可編譯程式碼。
  • 經過該變更後,編譯器會發現系統使用 b 的時間,只會在新可變動項透過 c 借用 a 之前。這是借用檢查器中的功能,稱為「非詞彙生命週期」(non-lexical lifetimes)。
  • 專屬參照的約束力很強。Rust 會利用這類參照,確保資料競爭的情形不會發生;此外,也會「透過」這項約束,將程式碼最佳化。舉例來說,共用參照背後的值可以在該參照的生命週期內,安全地快取到暫存器中。
  • 借用檢查器在設計上考量了許多常見模式,例如同時對結構體中的不同欄位進行專屬參照。但檢查器也可能無法完全「理解」某些的情況,這通常會導致「與借用檢查器衝突」。