扩展其他包装箱中定义的特征时,似乎有两种默认实现新特征的方法。
特征的原始定义是
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
是针对具体的类的。那是对的吗?有没有办法在这里为这两种类型共享默认实现?在我的场景中,我只需要复制和粘贴整个实现,而只需更改第一行即可。
答案 0 :(得分:3)
如果我正确理解了您的问题,只需添加绑定到?Sized
的未调整大小(T
):
impl<T> Trait2 for T where T: Trait1 + ?Sized
这也为实现Trait2
的未定类型(例如dyn Trait1
)实现了Trait1
。默认情况下,所有类型参数都是带大小的,因此与不带大小的类型不匹配。