#[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
(或任何其他集合)中?
答案 0 :(得分:5)
由于对象安全规则,您不能做这种事情。该规则表示,不能将方法返回具体类型本身的特征作为特征对象。原因是特征对象会知道具体的类型。
此外,此特征没有方法(采用self
的函数),因此没有必要从中创建特征对象。
有关此规则here,there和此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.
}