24.内存操作Copy-Move-Clone.rs
生活随笔
收集整理的這篇文章主要介紹了
24.内存操作Copy-Move-Clone.rs
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/*
詳細(xì)請(qǐng)看:
https://zhuanlan.zhihu.com/p/21730929
https://zhuanlan.zhihu.com/p/184907190Clone VS Copy VS Move
首先看一下這個(gè)兩個(gè)trait的關(guān)系:
pub trait Sized {// Empty.
}
pub trait Clone: Sized {fn clone(&self) -> Self;fn clone_from(&mut self, source: &Self){}
}在編譯器眼里,它們與其它的 trait 不一樣。這幾個(gè) trait 內(nèi)部都沒(méi)有方法,它們的唯一任務(wù)是,給類型打一個(gè)“標(biāo)記”,表明它符合某種約定,這些約定會(huì)影響編譯器的靜態(tài)檢查以及代碼生成
pub trait Copy: Clone {// Empty.
}*/fn test_1() {//不實(shí)現(xiàn)任何特性也可以直接復(fù)制struct TestCopy0 {data: i32,}let t1: TestCopy0 = TestCopy0 { data: 12 };let t2 = t1;//Copy trait 是給編譯器用的,告訴編譯器這個(gè)類型默認(rèn)采用 copy 語(yǔ)義,而不是 move 語(yǔ)義。//一旦一個(gè)類型實(shí)現(xiàn)了 Copy trait,那么它在變量綁定、函數(shù)參數(shù)傳遞、函數(shù)返回值傳遞等場(chǎng)景下,它都是 copy 語(yǔ)義,而不再是默認(rèn)的 move 語(yǔ)義//并不是所有的類型都可以實(shí)現(xiàn)Copy trait。Rust規(guī)定,對(duì)于自定義類型,只有所有的成員都實(shí)現(xiàn)了 Copy trait,這個(gè)類型才有資格實(shí)現(xiàn) Copy trait//常見(jiàn)的數(shù)字類型、bool類型、共享借用指針&,都是具有 Copy 屬性的類型。而 Box、Vec、可寫借用指針&mut 等類型都是不具備 Copy 屬性的類型//#[derive(Copy)] -- the trait `Clone` is not implemented for `TestCopy`.要實(shí)現(xiàn)copy必須同時(shí)實(shí)現(xiàn)clone#[derive(Debug, Copy, Clone)]struct TestCopy {data: i32,}let t1: TestCopy = TestCopy { data: 12 };let t2 = t1; //實(shí)現(xiàn)與不實(shí)現(xiàn)copy,這一行應(yīng)該有很大差別println!("{:?}", t1); //不實(shí)現(xiàn)copy,經(jīng)過(guò)上面的賦值操作再次使用t1會(huì)編譯不過(guò).value borrowed here after move// 為了能讓#[derive(Copy, Clone)]正常工作,結(jié)構(gòu)體或枚舉的所有成員自身必須是Copy類型。例如,下面這樣就無(wú)法正常工作:// #[derive(Copy, Clone)]// struct Numbers {// nums: Vec<i32>,// }///------------------------------------------Clone----------------------------------------------------//Clone trait 是給程序員用的,我們必須手動(dòng)調(diào)用clone方法,它才能發(fā)揮作用。#[derive(Debug, Clone)]struct TestCopy2 {data: i32,}let t1: TestCopy2 = TestCopy2 { data: 12 };let t2 = t1.clone(); //不實(shí)現(xiàn)Clone的特性不可以調(diào)用clone函數(shù)println!("{:?}", t1);//基礎(chǔ)類型系統(tǒng)幫他們實(shí)現(xiàn)了Clone的特性let t1 = 3;let t2 = t1.clone();let t1 = (1, "1", 1.1);let t2 = t1.clone();//Clone trait 里面的 clone 方法究竟會(huì)執(zhí)行什么操作,則是取決于程序員自己寫的邏輯。#[derive(Debug)]struct TestCopy3 {data: i32,}impl Clone for TestCopy3 {fn clone(&self) -> Self {let t = TestCopy3 {data: self.data + 100000,};t}fn clone_from(&mut self, source: &Self) {*self = source.clone()}}let t1: TestCopy3 = TestCopy3 { data: 12 };let t2 = t1.clone(); //不實(shí)現(xiàn)Clone的特性不可以調(diào)用clone函數(shù)println!("{:?}", t2);}fn test_2() {let v: Vec<i32> = Vec::new();//這就是move,轉(zhuǎn)移所有權(quán)的,用來(lái)控制變量所有權(quán).移動(dòng)之后之前的值就會(huì)失效了let v1 = v; //v1 is the new owner//println!("{:?}", v);let v: i32 = 42;let v1 = v;println!("v is {}", v); //compiles fine, no error!//像這樣沒(méi)有擁有其他資源的類型且可以被逐位拷貝(bitwise copy)的類型被稱為Copy類型。它們實(shí)現(xiàn)了Copy marker trait[2]。所有的基本類型,像整數(shù),浮點(diǎn)數(shù)和字符都是Copy類型
}fn main() {test_1();test_2();
}
?
總結(jié)
以上是生活随笔為你收集整理的24.内存操作Copy-Move-Clone.rs的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 23.所有权.rs
- 下一篇: 25.智能指针.rs