如何从盒装特质创建特质对象?
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
类型的值的大小 - 所有局部变量必须具有静态已知大小
如何解决这些错误并实现我想要做的?
答案
你可以使用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);
}
以上是关于如何从盒装特质创建特质对象?的主要内容,如果未能解决你的问题,请参考以下文章