03. Rust 内存管理 Copy & Clone(下)
标签搜索

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

limit
2018-12-17 / 0 评论 / 6 阅读 / 正在检测是否收录...

Copy

之前讲到 Rust 有部分类型是默认实现了 std::marker::Copy trait 的.
Rust 有很多类型, 有 整型, 浮点型, 布尔型 和 字符型, 还有 元组, 数组, 此外还有结构体, 枚举类型, & 借用指针, &mut 可变借用指针, 还有标准库提供的类型...

默认实现了 Copy 的类型

像 整型, 浮点型, 布尔型, 字符型, 都是实现了 Copy trait 的, 元组类型, 如果某个元组内的值都实现了 Copy trait, 那这个元组也是 impl Copy 类型, 数组同理.

需要手动实现 Copy 的类型

Rust 的结构体, 枚举类型, 如果它们的内部都是 impl Copy 的, 那么它们也可以自己手动 impl Copy.

无法实现 Copy 的类型

Box 就是无法实现 Copy 的类型, 原因很简单, 如果 Box 可以实现 Copy, 那么就会有多次释放这类问题. 还有可变借用指针的类型 &mut T, 同样的理由.

Clone

Rust 有些类型是实现了 std::clone::Clone trait 的. 实现了这个 trait 就可以有 clone 函数. 这个 trait 还有一个 clone_from 函数, 这个函数是有默认实现的.

#[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 就好了, 主要是避免手动实现出错.

0

评论 (0)

取消