02. Rust 內存管理 Copy & Clone(上)

Clone

Rust 語法上一個變量的值是轉移給另外一個變量, 可是有些狀況下可能會想變量值轉移以後, 自身還能繼續使用. 可使用 clone 函數函數

let a = String::from("test");
let b = a.clone();
println!("{}", a);
複製代碼

clone 這個函數是在標準庫的 std::clone::Clone trait 裏, 既然是個 trait, 也就意味着能夠本身實現一套操做, 一般狀況下用默認的定義就行了.ui

Copy

咱們如今瞭解到每次綁定變量, 都會發生全部權轉移, 可是你會發現寫有些東西的時候好像行爲跟目前的認知有點不同.spa

let a: i32 = 10;
let b = a;
println!("a = {}", a); // a = 10
複製代碼

a 沒有使用 clone 還能使用, 緣由是 Rust 有部分類型默認實現了 std::marker::Copy trait. 像 structs 這類沒有默認實現的類型, 想要這樣就得實現一下 Copy.code

fn main() {
    let p1 = Point { x: 1.0, y: 1.0 };
    let p2 = p1;
    println!("p1 = {:?}", p1);
}

#[derive(Debug)]
struct Point {
    x: f64,
    y: f64,
}

impl Copy for Point {}
複製代碼

可是其實這樣仍是無法用的, 編譯後就報錯了, 由於 struct Point 沒有實現 Clone trait.string

pub fn main() {
    let p1 = Point { x: 1.0, y: 1.0 };
    let p2: Point = p1;
    println!("p1 = {:?}", p1);
}

#[derive(Debug)]
struct Point {
    x: f64,
    y: f64,
}

impl Clone for Point {
    fn clone(&self) -> Self {
        Self { x: self.x, y: self.y }
    }
}

impl Copy for Point {}
複製代碼

如今終於好使了. 可是咱們發覺作這些操做很是煩, 咱們注意到 #[derive(Debug)] 這個東西, 恰好 Rust 提供了Clone, Copy 的屬性.it

pub fn main() {
    let p1 = Point { x: 1.0, y: 1.0 };
    let p2: Point = p1;
    println!("p1 = {:?}", p1);
}

#[derive(Debug, Clone, Copy)]
struct Point {
    x: f64,
    y: f64,
}
複製代碼

Rust 默認綁定變量是進行 move 行爲, 想要保留 move 前的變量, 可使用 clone 函數, 想要實現基本類型同樣的 copy 行爲, 咱們能夠添加 Clone, Copy 屬性.io

相關文章
相關標籤/搜索