03. Rust 內存管理 Copy & Clone(下)

Copy

以前講到 Rust 有部分類型是默認實現了 std::marker::Copy trait 的. Rust 有不少類型, 有 整型, 浮點型, 布爾型 和 字符型, 還有 元組, 數組, 此外還有結構體, 枚舉類型, & 借用指針, &mut 可變借用指針, 還有標準庫提供的類型...數組

默認實現了 Copy 的類型

像 整型, 浮點型, 布爾型, 字符型, 都是實現了 Copy trait 的, 元組類型, 若是某個元組內的值都實現了 Copy trait, 那這個元組也是 impl Copy 類型, 數組同理.ide

須要手動實現 Copy 的類型

Rust 的結構體, 枚舉類型, 若是它們的內部都是 impl Copy 的, 那麼它們也能夠本身手動 impl Copy.函數

沒法實現 Copy 的類型

Box 就是沒法實現 Copy 的類型, 緣由很簡單, 若是 Box 能夠實現 Copy, 那麼就會有屢次釋放這類問題. 還有可變借用指針的類型 &mut T, 一樣的理由.ui

Clone

Rust 有些類型是實現了 std::clone::Clone trait 的. 實現了這個 trait 就能夠有 clone 函數. 這個 trait 還有一個 clone_from 函數, 這個函數是有默認實現的.spa

#[stable(feature = "rust1", since = "1.0.0")]
#[lang = "clone"]
pub trait Clone : Sized {
    #[stable(feature = "rust1", since = "1.0.0")]
    #[must_use = "cloning is often expensive and is not expected to have side effects"]
    fn clone(&self) -> Self;

    #[inline]
    #[stable(feature = "rust1", since = "1.0.0")]
    fn clone_from(&mut self, source: &Self) {
        *self = source.clone()
    }
}
複製代碼

理論上, 咱們能夠按照本身的要求實現 clone, 對於有 Copy 約束的類型, 實現 Clone trait 須要保證跟 Copy 是相容的, 也就是咱們本身實現的 Clone 不會致使 Copy 的行爲不正確. 一般狀況下咱們使用 Rust 的 #[derive(Clone)] 自動實現 Clone 就行了, 主要是避免手動實現出錯.指針

相關文章
相關標籤/搜索