當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust Clone用法及代碼示例


本文簡要介紹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: Copyx: Ty: &T ,則 let x = y.clone(); 等價於 let x = *y; 。手動實現應該小心維護這個不變量;但是,不安全的代碼不能依賴它來確保內存安全。

一個示例是包含函數指針的通用結構。在這種情況下,Clone的實現不能是derived,而是可以實現為:

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-lang.org大神的英文原創作品 Trait std::clone::Clone。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。