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 就行了, 主要是避免手动实现出错.指针

相关文章
相关标签/搜索