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