rust - Supertrait 仅当 Self : Sized

标签 rust traits

假设我有一个特质

trait A {
    fn new() -> Self where Self : Sized;
    fn foo(&self) -> i32;
}
struct B {
   data : i32
}
impl A for B {
    fn new() -> Self {
        B {data : 42}
    }
    fn foo(&self) -> i32 {
        self.data
    }
}

现在我可以使用 Box<dyn A> ,我只是没有可用的 new() 方法。 当我有一个通用的 T : A ,我能做到T::new() .所以我可以将 A 用作特征对象(没有阻止这种情况的函数),我可以在模板代码中使用它并使用它上面的所有函数。

我的问题是,是否有可能在具有例如 Clone 时出现此行为?作为 super 特质? 在dyn A案例A不实现克隆。在一般情况下是这样。

最佳答案

你可以这样做:

trait A {
    fn new() -> Self where Self : Sized;
    fn foo(&self) -> i32;
}

#[derive(Clone)]
struct B {
   data : i32
}

impl A for B {
    fn new() -> Self {
        B {data : 42}
    }
    fn foo(&self) -> i32 {
        self.data
    }
}


fn make_clone<T: Clone + A>(toc: &T) -> T {
    dbg!(toc.foo());
    toc.clone()
}

fn main() {
    let b = B{data: 0};
    make_clone(&b);
}

所以你可以从 make_clone 访问 A 方法和 Clone supertrait,你显然可以用 supertrait 而不是 a泛型方法

关于rust - Supertrait 仅当 Self : Sized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58237711/

相关文章:

rust - 证明struct字段的生命周期超过另一个生命周期

Scala 特征混合顺序和 super 调用

rust - 特征对象和特征的直接实现者的特征实现

rust - 如何在关联类型上定义特征范围?

rust - 为什么不打印!在 Rust 单元测试中工作?

rust - 我如何获得 Rust 的 openssl crate 来解密来自对称加密 gem 的数据,而不会出现 Node Crypto 自动删除的乱码?

rust - rust迭代器的position()和rposition()之间有什么区别,有什么原因吗?

scala - 在 Scalatest 中实现工厂

scala - < : 的特征继承

rust - 如何防止移入功能的 impl Trait 在借用时被删除?