Извините, если это кажется тривиальным, но я пытаюсь выполнить простую операцию, но мне очень трудно это сделать. Я просто хочу иметь два объекта признаков, в которых есть вектор, содержащий кучу другого объекта.Охватывая объекты признаков в объекте базовой цели
trait MetaClass {
fn new() -> Self;
fn add(&self, subtrait: Box<SubClass>);
}
struct MetaStruct {
elems: Vec<Box<SubClass>>,
}
impl MetaClass for MetaStruct{
fn new() -> MetaStruct {
MetaStruct{
elems: Vec::new(),
}
}
fn add(&self, subtrait: Box<SubClass>){
// if I reformulate the above to 'fn add(&self, subtrait: SubClass){'
// and use the below I get the trait `core::marker::Sized` is not implemented for the type `SubClass`
//self.elems.push(Box::new(subtrait));
self.elems.push(subtrait);
}
}
trait SubClass{
fn new() -> Self;
}
struct MySubClass {
data: i32,
}
impl SubClass for MySubClass {
fn new() -> MySubClass{
MySubClass{
data: 10,
}
}
}
fn main(){
let mut meta = Box::new(MetaStruct::new());
// ideally I just want to do meta.add(MySubClass::new()) but as mentioned above that has some sizing issues :'(
meta.add(Box::new(MySubClass::new()));
}
Ошибка я получаю:
<anon>:45:11: 45:38 error: cannot convert to a trait object because trait `SubClass` is not object-safe [E0038]
<anon>:45 meta.add(Box::new(MySubClass::new()));
^~~~~~~~~~~~~~~~~~~~~~~~~~~
Вот ссылка на ржавчину игры: http://is.gd/pjLheJ
Я также попытался следующие, но получил ту же ошибку:
meta.add(Box::new(MySubClass::new()) as Box<SubClass>);
В идеале, если есть способ сделать это с помощью статической отправки Rust, которая была бы идеальной, но Я был бы в порядке с динамической диспетчеризацией. В каждом случае, я думаю, будет иметь смысл, чтобы MetaClass фактически принадлежал объекту подкласса, поэтому я не хочу передавать ссылку на него, но весь объект сам.
Это было [перекресток, отправленный в Reddit] (http://www.reddit.com/r/rust/comments/3ebxuy/trouble_understanding_cascading_trait_objects/) – Shepmaster