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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从盒装特质创建特质对象?相关的知识,希望对你有一定的参考价值。

我想与DST合作,并有以下场景

我有以下特征,能够采取Box并返回新的特征对象:

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

我遵循不同的结构实现MyTrait结构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),
    }
}    

然后我有以下函数将我的特征对象作为盒装值,然后将其传递给MyTrait静态方法。

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

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

这里的主要问题是,当我执行代码时,我遇到两个不同的错误:

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

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

Playground

答案

你可以使用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);
}

以上是关于如何从盒装特质创建特质对象?的主要内容,如果未能解决你的问题,请参考以下文章

特质不能变成对象

Scala的特质

----特质

Scala进阶之App特质

大数据Scala系列之特质

特质trait