假设我有一个特质
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/