學習 Rust「3」所有權


學習 Rust「3」所有權

Why Rust?


摘要

Rust 三大設計宗旨:內存安全、零成本抽象、實用。本文從所有權角度來學習師兄妹的愛恨情仇“內存安全”。

所有權規則

  • 值歸變量所有。
  • 當變量超出使用範圍時,變量值所佔用的內存將被釋放。這是類似於 C++ 的 RAII 概念。
  • 變量值可以由其他變量使用,但需遵守由編譯器強制要求的若干規則。

前兩條是其它語言也有的,沒啥好說,重點放在第三條。

四種使用方法和規則

  • 克隆(clone):此處將值複製到新的變量。新變量擁有新的複製值的所有權,而原始變量保留其原始值的所有權。你有一本書,穌按照你那本書,買了一樣的書。你的書是你的書,穌的書是穌的書。
  • 移動(move):所有權被轉移到另一個要使用該值的變量,原始變量不再擁有所有權。學姐含情脈脈地把她的書送給穌。
  • 不可變借用(immutable borrow):沒有發生所有權轉移,但是可以通過另一個變量讀取該值。當借用變量超出範圍,內存不會被回收,因為借用變量沒有所有權。學長不太情願地把書借給穌,並交代:“書借你,只能看,絕壁不要在上面做筆記,被我發現會砍死你的哦!我偶爾會找你查查。”
  • 可變借用(mutable borrow):可以通過另一個變量對該值進行讀取和寫入操作。當借用變量超出範圍,內存也不會回收,因為借用變量沒有所有權。穌把書借給學妹時說:“這書你隨便用,把穌的書當做你自己的書,等到用不上時再還。”

重點在於一個“借”字:書的所有權屬於其主人,但主人將書借出之後,自己是無法再在書上做筆記啦!

不可變借用(immutable borrow)規則

  • 借出期間,借方不能寫:學長說過,在書上亂畫,要砍死穌!
  • 借出期間,所有者不能寫:這書學長已經學完,偶爾要複習,但已經不需要寫筆記,借出去之後就更不會寫了。
<code>fn main() {
let mut owner = format!("學長的書");

// 學長大筆一揮,在書上記了一點心得!
owner.push('.');

// 穌不可變借用學長的書
let borrower = &owner;

// 學長隨時可以來找穌翻翻他自己的書
println!("學長讀{}", owner);
println!("學長再讀{}", owner);

// 沒問題,穌可以讀學長的書
println!("穌讀{}", borrower);

// error: 書還在穌手裡,學長不能寫
//owner.push('.');

println!("穌再讀{}", borrower);

// error: 學長說過,在書上亂畫,要砍死穌!
//borrower.push('.');

// 穌已經歸還,學長可以做筆記了

owner.push('.');
}/<code>

可變借用(mutable borrow)規則

  • 不能多次可變借用:只能有一個獨佔的學妹(active borrow),穌不能同時承諾給多個學妹“隨便用”,不然學妹們可能打起來……
  • 所有者不能再讀寫:書在學妹手裡隨便蹂躪,穌雖然心疼,但不能說!等她爽(huan)了再說吧。
<code>fn main() {
let mut owner = format!("穌的書");

// 學妹可變借用穌的書
let mutable_borrower = &mut owner;

// error[E0499]: cannot borrow `owner` as mutable more than once at a time
// 學姐也要借,穌表示:要書沒有,要命一條!
//let mutable_borrower_b = &mut owner;

println!("學妹讀{}", mutable_borrower);

// error[E0502]: cannot borrow `owner` as immutable because it is also borrowed as mutable
// 學妹暫時完全掌控穌的書
//println!("穌讀不鳥{}", owner);

// 學妹大筆一揮,在書上記了一點心得!
mutable_borrower.push('.');
println!("學妹再讀{}", mutable_borrower);

// 穌已經歸還,穌可以做筆記了

owner.push('!');
println!("穌讀{}", owner);
}/<code>


分享到:


相關文章: