Rust編程基礎:00八、全部權

一、Rust經過全部權機制來管理內存,編譯器在編譯就會根據全部權規則對內存的使用進行檢查。
二、堆和棧。編譯的時候數據的類型大小是固定的,就是分配在棧上的。編譯的時候數據類型大小不固定,就是分配在堆上的。git

let x: i32 = 1; // x被分配在棧上
let s1 = String::from("hello"); // s1被分配在堆上
s1.push_str(" world");
println!("s1 = {}", s1);

三、做用域:{}github

let x: i32 = 1;
{
    let y: i32 = 1;
    println!("x = {}", x);
}
println!("y = {}", y); // 錯誤!在y的做用域以外使用y

四、String內存回收。String類型在離開做用域的時候會調用drop方法。
五、move移動。函數

let s1 = String::from("hello");
let s2 = s1; // move語義
println("s2 = {}", s2);
println("s1 = {}", s1); // 錯誤!s1被借用

六、clone克隆。url

let s1 = String::from("hello");
let s2 = s1.clone(); // clone語義
println("s2 = {}", s2);
println("s1 = {}", s1); // 沒有問題!s1被克隆

七、棧上數據拷貝。經常使用的具備copy trait特徵的有:全部的整型、浮點型、布爾型、字符類型、元組等。.net

let a = 1;
let b = a; // copy語義
println!("a = {}, b = {}", a, b); // 沒有問題!棧上的變量被拷貝

八、函數和做用域。code

fn takes_ownership(some_string: String) -> String {
    println!("{}", some_string);
    some_string
}

fn makes_copy(i: i32) {
    println!("i = {}", i);
}

fn main() {
    let s = String::from("hello");
    let s1 = takes_ownership(s); // move語義
    println!("{}", s); // 錯誤!s已經被借用
    println!("{}", s1);

    let x = 5;
    makes_copy(x); // copy語義
    println!("{}", x); // 沒有問題!x具備copy特徵
}


本節的完整源代碼:
https://github.com/anonymousGiga/learn_rust/blob/master/learn_own/src/main.rs
https://github.com/anonymousGiga/learn_rust/blob/master/learn_fn2/src/main.rsip

相關文章
相關標籤/搜索