如何将大小特征插入集合

时间:2018-08-20 06:20:55

标签: rust

Playground

#[derive(Default)]
struct Bar;

#[derive(Default)]
struct Baz;

fn main() {
    let mut vec = Vec::<Box<dyn Default>>::new();
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::default::Default` cannot be made into an object
    vec.push(Box::new(Bar));
    vec.push(Box::new(Baz));
}

Default是一个特长,即cannot convert it to a trait object

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

1 个答案:

答案 0 :(得分:5)

由于对象安全规则,您不能做这种事情。该规则表示,不能将方法返回具体类型本身的特征作为特征对象。原因是特征对象会知道具体的类型。

此外,此特征没有方法(采用self的函数),因此没有必要从中创建特征对象。

有关此规则herethere和此blog article的更多信息。

另请参阅this question


此规则非常直观:您希望代码做什么?

#[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.
}