Rust中的impl和derive有什么区别?

3

我是Rust的新手。我在Rust编译器中找到了这段代码。

#[must_use]
pub struct IeeeFloat<S> {
    /// Absolute significand value (including the integer bit).
    sig: [Limb; 1],

    /// The signed unbiased exponent of the value.
    exp: ExpInt,

    /// What kind of floating point number this is.
    category: Category,

    /// Sign bit of the number.
    sign: bool,

    marker: PhantomData<S>,
}

然后他们做了。
impl<S> Copy for IeeeFloat<S> {}
impl<S> Clone for IeeeFloat<S> {
    fn clone(&self) -> Self {
        *self
    }
}

我的问题是,这不就跟#[derive(Copy, Clone)]一样吗?为什么他们还要明确地写出impl Copy for IEEE?而且这个克隆实现不就跟标准库里的克隆一样吗?为什么要重新定义它呢?

链接 在此处

1个回答

6
不,这不同于派生,因为编译器不会将其泛化到足够的程度。当您有一个泛型类型 T<U>,并尝试为其派生 Clone 时,它只会为 U: Clone 实现 T<U>Clone即使在没有 U: Clone 的情况下也可以克隆 T<U>。请注意,这适用于 IeeeFloat<S>,因为对于所有 SPhantomData<S>: Clone

那么你为什么认为他们明确编写了克隆函数?而且在std中定义似乎是相同的。 - merovingian
@merovingian 去除克隆所需的绑定 S: Clone 和复制所需的绑定 S: Copy - Bamontan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接