繁体   English   中英

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

[英]How to insert sized traits into a collection

操场

#[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));
}

默认值是一个大小的Trait,这意味着您无法将其转换为特征对象

对于上面的示例,是否有解决方法,因此我可以在Vec (或任何其他集合)中存储大小的特征?

由于对象安全规则,你不能做这样的事情。 该规则表示方法返回具体类型本身的特征不能成为特征对象。 原因是特质对象已经知道具体类型。

此外,这个特性没有方法(一个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.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM