gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:28:31 28 4
gpt4 key购买 nike

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

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()
}
}
我观察到的是,当与 trait 对象混合时,这两种实现都是必需的。
我了解 impl<T>一个用于具体类,另一个用于 dyn对象。那是对的吗?有没有办法在这里为这两种类型共享默认实现?在我的场景中,我只需要更改第一行就必须复制和粘贴整个实现。

最佳答案

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

impl<T> Trait2 for T where T: Trait1 + ?Sized
这实现了 Trait2对于实现 dyn Trait1 的未确定大小的类型(例如 Trait1 )也是。默认情况下,所有类型参数都已调整大小,因此不匹配未调整大小的类型。
Playground

关于rust - `impl<T> Trait for T where T: Trait2` 和 `impl Trait for dyn Trait2` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64564170/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com