`impl<T> Trait for T where T: Trait2` 和 `impl Trait for dyn Trait2` 有什么区别?

What's the difference between `impl<T> Trait for T where T: Trait2` and `impl Trait for dyn Trait2`?

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

性状的原始定义是

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

为了扩展这个trait的功能,我们定义一个trait 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 对象的。那是对的吗?有什么方法可以在此处共享这两种类型的默认实现吗?在我的场景中,我不得不复制并粘贴整个实现,只更改第一行。

如果我对你的问题的理解正确,只需将未调整大小的 (?Sized) 添加到 T:

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

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

Playground