`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
。默认情况下,所有类型参数都会调整大小,因此不匹配未调整大小的类型。
在扩展其他 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
。默认情况下,所有类型参数都会调整大小,因此不匹配未调整大小的类型。