首發於個人rust 學習日記git
規則
- Rust 中的每個值都有一個被稱爲其 全部者(owner)的變量。
- 值有且只有一個全部者。
- 當全部者(變量)離開做用域,這個值將被丟棄。(Rust 在結尾的 }處自動調用 drop釋放內存)
- 移動(堆內存變量),當值(s1)被賦值給另一個變量(s2)後,rust則認爲變量s1,再也不有效。
- 棧類型變量無移動的說法(沒有深淺拷貝的區別)
- 將值傳遞給函數在語義上與給變量賦值類似
變量與數據的交互(move)
- 圖1-2(s1和s2的引用圖(錯誤)其餘語言js\go 是這樣的)
- 圖1-3(s1和s2的引用圖(正確)rust 是這樣的,s1賦值s2後,Rust 則認爲 s1 再也不有效)
當值(s1)被賦值給另一個變量(s2)後,rust則認爲變量s1,再也不有效(圖1-3)
克隆(深拷貝)
- 實現以下圖,賦值變量的同時,進行數據拷貝的方案,rust也是支持的
- 這段代碼能正常運行,產生的變量內存如圖1-4
fn main() {
let s1 = String::from("hello");
let s2 = s1.clone();
println!("s1 = {}, s2 = {}", s1, s2);
}
複製代碼
- 圖1-4
棧類型變量無移動的說法(純拷貝)
- x,y是編譯時肯定大小的類型,所以整個存儲在棧上,因此拷貝其實際的值是快速的。所以rust對棧變量進行純拷貝,便不會形成性能的影響。
- 也就意味着建立變量 y 後, 不必使x 無效。
let x = 5;
let y = x;
println!("x = {}, y = {}", x, y);
複製代碼
將值傳遞給函數在語義上與給變量賦值類似
fn main() {
let s = String::from("hello");
run_move(s);
let x = 5;
run_copy(x);
println!("x:{}",x);
}
fn run_move(some_string: String) {
println!("run_move:{}", some_string);
}
fn run_copy(some_integer: i32) {
println!("run_copy:{}", some_integer);
}
複製代碼