Why Rust?
摘要
Rust 三大設計宗旨:內存安全、零成本抽象、實用。本文從所有權角度來學習師兄妹的愛恨情仇“內存安全”。
所有權規則
值歸變量所有。當變量超出使用範圍時,變量值所佔用的內存將被釋放。這是類似於 C++ 的 RAII 概念。變量值可以由其他變量使用,但需遵守由編譯器強制要求的若干規則。前兩條是其它語言也有的,沒啥好說,重點放在第三條。
四種使用方法和規則
克隆(clone):此處將值複製到新的變量。新變量擁有新的複製值的所有權,而原始變量保留其原始值的所有權。你有一本書,穌按照你那本書,買了一樣的書。你的書是你的書,穌的書是穌的書。移動(move):所有權被轉移到另一個要使用該值的變量,原始變量不再擁有所有權。學姐含情脈脈地把她的書送給重點在於一個“借”字:書的所有權屬於其主人,但主人將書借出之後,自己是無法再在書上做筆記啦!
不可變借用(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>