rust - 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
在一般情况下是。
解决方案
你可以这样做:
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
,你显然可以用超特征而不是泛型方法做同样的事情
推荐阅读
- c++ - C++11 shared_ptr 和 pthread
- android - 更改 TextInputLayout 错误和边框文本颜色
- python - 如何在python中并排打印两个字符串(大文本)?
- sql - 将组的聚合值与整个表的聚合值进行比较
- reactjs - 将图像从一个组件传递到另一个 React
- sql - 高效设计工作流程以将表格合并在一起
- java - 将导航抽屉和未选项卡的片段组合到同一个活动
- r - 如何在postgres中使用移位函数来逐行确定时间差?
- docker - 为什么无法访问 docker-compose 容器?
- javascript - javascript array.find() 对象未定义?