首页 > 解决方案 > Supertrait 仅当 Self : Sized

问题描述

假设我有一个特质

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超级特质时是否有可能获得这种行为?在不执行Clone的dyn A情况下。A在一般情况下是。

标签: rusttraits

解决方案


你可以这样做:

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);
}

所以你可以从 访问A方法和Clone超特征make_clone,你显然可以用超特征而不是泛型方法做同样的事情


推荐阅读