[英]Supertrait only when 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 作为特征 object (没有阻止这种情况的函数),我可以在模板代码中使用它并使用它上面的所有函数。
我的问题是,当将Clone
作为超级特征时,是否有可能获得这种行为? 在dyn A
情况下A
没有实现 Clone。 在一般情况下是。
你可以这样做:
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
超特征,显然您可以使用超特征而不是泛型方法做同样的事情
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.