Rust 如何将大小特征插入到集合中

Rust 如何将大小特征插入到集合中,rust,Rust,#[派生(默认)] 结构杆; #[衍生(默认)] 结构Baz; fn main(){ 让mut-vec=vec:::new(); //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 向量推送(框:新(条)); 矢量推送(盒::新(Baz)); } 是一种体型特征,也就是说你 对于上面的示例,是否有一个变通方法,以便我可以将大小特征存储在Vec(或任何其

#[派生(默认)]
结构杆;
#[衍生(默认)]
结构Baz;
fn main(){
让mut-vec=vec:::new();
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
向量推送(框:新(条));
矢量推送(盒::新(Baz));
}
是一种体型特征,也就是说你


对于上面的示例,是否有一个变通方法,以便我可以将大小特征存储在
Vec
(或任何其他集合)中?

由于对象安全规则,您无法执行此操作。此规则表示,方法返回具体类型本身的trait不能生成trait对象。原因是trait对象应该知道具体的类型

此外,该特征没有方法(一个接受
self
的函数),因此没有必要从中创建特征对象

有关此规则的更多信息,请参见

另见


这条规则非常直观:您希望您的代码做什么

#[derive(Default)]
struct Bar;

#[derive(Default)]
struct Baz;

fn main() {
    let mut vec = Vec::<Box<dyn Default>>::new();
    vec.push(Box::new(Bar));
    vec.push(Box::new(Baz));

    vec.first().unwrap()::new();
    // Whatever the syntax should be, what do you expect this to return?
    // This type cannot be know at compile time.
}
#[派生(默认)]
结构杆;
#[衍生(默认)]
结构Baz;
fn main(){
让mut-vec=vec:::new();
向量推送(框:新(条));
矢量推送(盒::新(Baz));
vec.first().unwrap()::new();
//无论语法应该是什么,您希望它返回什么?
//在编译时无法知道此类型。
}

我认为没有任何解决办法。有一个默认向量有什么意义?它应该如何工作?你可以调用trait提供的方法(在本例中是
default
),就像调用任何其他trait一样。你想创建一个工厂吗?@hellow这是一个不需要
self
的工厂函数。试图用一些已经存在的对象调用它是没有意义的,比如
obj.default()
@ozkriff我已经在我的回答中添加了这一点我多么希望规则是另一种方式:即,允许这些特征被装箱,等等。。。但只允许访问对象安全的接口子集。@MatthieuM。我认为这是可能的,而且可以追溯。让我们做一个RFC;)
#[derive(Default)]
struct Bar;

#[derive(Default)]
struct Baz;

fn main() {
    let mut vec = Vec::<Box<dyn Default>>::new();
    vec.push(Box::new(Bar));
    vec.push(Box::new(Baz));

    vec.first().unwrap()::new();
    // Whatever the syntax should be, what do you expect this to return?
    // This type cannot be know at compile time.
}