T的“ impl <T>特质,其中T:Trait2”和dyn的“ impl Trait”之间有什么区别?

时间:2020-10-27 23:03:46

标签: rust traits

扩展其他包装箱中定义的特征时,似乎有两种默认实现新特征的方法。

特征的原始定义是

pub trait Trait1 {
    fn f1(&self);
}

为了扩展此特征的功能,我们定义一个特征Trait2

pub trait Trait2 {
    fn f2(&self);
}

现在,因为我们希望该功能默认情况下可用,所以我们可以实现以下

impl<T> Trait2 for T
where
    T: Trait1,
{
    pub fn f2(&self) {
        self.f1()
    }
}

impl Trait2 for dyn Trait1 {
    pub fn f2(&self) {
        self.f1()
    }
}

我观察到的是,当与特征对象混合时,这两个实现都是必需的。

我了解到impl<T>是针对具体类的,而其他dyn是针对具体的类的。那是对的吗?有没有办法在这里为这两种类型共享默认实现?在我的场景中,我只需要复制和粘贴整个实现,而只需更改第一行即可。

1 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,只需添加绑定到?Sized的未调整大小(T):

impl<T> Trait2 for T where T: Trait1 + ?Sized

这也为实现Trait2的未定类型(例如dyn Trait1)实现了Trait1。默认情况下,所有类型参数都是带大小的,因此与不带大小的类型不匹配。

Playground