如何从盒装特征创建特征对象?

时间:2019-01-07 10:07:08

标签: rust

我想使用DST并具有以下情况

我具有以下特征,可以将Box移出并返回新的特质对象:

pub trait MyTrait {
    fn create_from_box(boxed: Box<Self>) -> Self
    where
        Self: Sized;
}

我关注正在实现MyTrait的不同结构     struct FirstStruct;

impl MyTrait for FirstStruct {
    fn create_from_box(boxed: Box<FirstStruct>) -> FirstStruct {
        FirstStruct // Build another struct with some logic and boxed struct values
    }
}

struct SecondStruct;

impl MyTrait for SecondStruct {
    fn create_from_box(boxed: Box<SecondStruct>) -> SecondStruct {
        SecondStruct // Build another struct with some logic and boxed struct values
    }
}

我有一个函数,可以通过一些条件逻辑来获取我的特征对象

fn get_my_trait_object() -> Box<MyTrait> {
    let condition = true; // Retrieved via some logic .

    match condition {
        true => Box::new(FirstStruct),
        false => Box::new(SecondStruct),
    }
}    

然后我有以下函数,该函数将我的trait对象作为框值获取,然后将其传递到MyTrait静态方法中。

然后尝试创建一个新的MyTrait对象,稍后将使用它。

pub fn main() {
    let boxed = get_my_trait_object();
    let desired_trait_object = MyTrait::create_from_box(boxed);
}

这里的主要问题是,当我执行代码时,出现以下两个不同的错误:

  • 在编译时无法知道类型dyn MyTrait的值的大小
  • 所有局部变量必须具有静态已知的大小

我该如何解决这些错误并实现我想做的事情?

Playground

1 个答案:

答案 0 :(得分:1)

即使您的类型是装箱的,也可以使用self(请参阅into_vec),这样您的解决方案就可以了。

pub trait CreateFromBox {
    fn create_from_box(self: Box<Self>) -> Self;
}

#[derive(Debug, Clone)]
struct Foo(u32);
impl CreateFromBox for Foo {
    fn create_from_box(self: Box<Self>) -> Self {
        Self(self.0 + 1)
    }
}

fn main() {
    let a: Box<Foo> = Box::new(Foo(3));
    let tmp = a.clone();
    let b: Foo = tmp.create_from_box();

    println!("{:?} {:?}", a, b);
}