假设我有一个特征
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
作为特征时,是否有可能出现这种现象?在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);
}
因此您可以访问A
方法和Clone
中的make_clone
超级特性,显然可以使用超级特性而不是通用方法执行相同的操作