1.Copy和Clone
Rust中的Copy和Clonetrait都允許創建型別實體的副本,它們都提供了一種復制型別實體的方法,但它們之間存在一些重要的區別,了解這些區別有助更好地使用這兩個特征,
2. Copytrait
Copytrait允許按位復制型別的實體,這意味著當您將一個變數賦值給另一個變數時,如果該型別實作了Copytrait,則會創建一個新的副本,這與移動語意不同,其中原始變數不再可用,
要使用derive屬性為型別自動生成Copytrait的實作,只需在型別定義之前添加#[derive(Copy)]即可,例如:
#[derive(Copy)]
struct Point {
x: i32,
y: i32,
}
復制代碼
請注意,并非所有型別都可以實作Copytrait,例如,具有堆分配欄位(如String或Vec<T>)的型別不能實作Copy,
3. Clonetrait
與之相反,Clonetrait提供了一個clone方法,用于創建型別實體的深層副本,這意味著即使型別具有堆分配欄位(如String或Vec<T>),也可以實作Clonetrait,
要為型別自動生成Clonetrait的實作,只需在型別定義之前添加#[derive(Clone)]即可,例如:
#[derive(Clone)]
struct Point {
x: i32,
y: i32,
}
復制代碼
但是,并非所有型別都可以使用derive屬性自動生成Clonetrait的實作,如果型別的某些欄位沒有實作
4. Copy和Clonetrait之間的區別
盡管Copy和Clonetrait都允許您創建型別實體的副本,但它們之間存在一些重要的區別,
首先,當您使用賦值陳述句復制一個實作了Copytrait的型別時,復制操作是隱式執行的,而當您使用clone方法復制一個實作了Clonetrait的型別時,復制操作是顯式執行的, 例如:
#[derive(Copy)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1
assert_eq!(p1.x, p2.x);
assert_eq!(p1.y, p2.y);
}
復制代碼
#[derive(Clone)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1.clone();
assert_eq!(p1.x, p2.x);
assert_eq!(p1.y, p2.y);
}
復制代碼
此外,這兩個trait分別適用于不同的場景,對于那些具有簡單按位復制語意的型別(如標量型別和由它們組成的陣列和元組),使用Copytrait更為方便,而對于那些需要執行深層復制操作的型別(如具有堆分配欄位的型別),則應使用Clonetrait,from劉金,轉載請注明原文鏈接,感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550779.html
標籤:其他
上一篇:LocalDateTime
下一篇:返回列表
