本文簡要介紹rust語言中 Trait std::clone::Clone
的用法。
用法
pub trait Clone {
fn clone(&self) -> Self;
fn clone_from(&mut self, source: &Self) { ... }
}
顯式複製對象的能力的共同特征。
與 Copy
的不同之處在於, Copy
是隱式的,並且是廉價的按位複製,而 Clone
始終是顯式的,可能很昂貴,也可能不昂貴。為了強製執行這些特性,Rust 不允許您重新實現 Copy
,但您可以重新實現 Clone
並運行任意代碼。
由於 Clone
比 Copy
更通用,因此您也可以自動將任何東西 Copy
設為 Clone
。
可導出的
如果所有字段都是 Clone
,則此特征可以與 #[derive]
一起使用。 Clone
的 derive
d 實現在每個字段上調用 clone
。
對於泛型結構,#[derive]
通過在泛型參數上添加綁定 Clone
有條件地實現 Clone
。
// `derive` implements Clone for Reading<T> when T is Clone.
#[derive(Clone)]
struct Reading<T> {
frequency: T,
}
如何實現 Clone
?
Copy
的類型應該有一個簡單的 Clone
實現。更正式地說:如果 T: Copy
、 x: T
和 y: &T
,則 let x = y.clone();
等價於 let x = *y;
。手動實現應該小心維護這個不變量;但是,不安全的代碼不能依賴它來確保內存安全。
一個示例是包含函數指針的通用結構。在這種情況下,Clone
的實現不能是derive
d,而是可以實現為:
struct Generate<T>(fn() -> T);
impl<T> Copy for Generate<T> {}
impl<T> Clone for Generate<T> {
fn clone(&self) -> Self {
*self
}
}
其他實現者
除了下麵列出的實現者之外,以下類型還實現 Clone
:
- 函數項類型(即為每個函數定義的不同類型)
- 函數指針類型(例如,
fn() -> i32
) - 元組類型,如果每個組件也實現
Clone
(例如,()
,(i32, bool)
) - 閉包類型,如果它們沒有從環境中捕獲任何值,或者所有這些捕獲的值都實現了
Clone
。請注意,共享引用捕獲的變量始終實現Clone
(即使引用對象沒有),而可變引用捕獲的變量從不實現Clone
。
相關用法
- Rust Clone.clone用法及代碼示例
- Rust CStr.into_c_string用法及代碼示例
- Rust Cursor.new用法及代碼示例
- Rust Condvar.notify_all用法及代碼示例
- Rust Cursor.remaining_slice用法及代碼示例
- Rust Command.args用法及代碼示例
- Rust Condvar.wait用法及代碼示例
- Rust Chars.as_str用法及代碼示例
- Rust CString.into_bytes用法及代碼示例
- Rust CStr.from_bytes_with_nul用法及代碼示例
- Rust Cow.is_owned用法及代碼示例
- Rust Cow用法及代碼示例
- Rust Condvar.wait_timeout用法及代碼示例
- Rust Condvar.wait_timeout_while用法及代碼示例
- Rust Command.env用法及代碼示例
- Rust CStr.from_bytes_with_nul_unchecked用法及代碼示例
- Rust Command.env_remove用法及代碼示例
- Rust Child用法及代碼示例
- Rust Command.get_args用法及代碼示例
- Rust Command.stdout用法及代碼示例
- Rust Chain.get_ref用法及代碼示例
- Rust Cursor.position用法及代碼示例
- Rust Cell.as_slice_of_cells用法及代碼示例
- Rust Command.stdin用法及代碼示例
- Rust Components用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait std::clone::Clone。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。