我想使用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
的值的大小我该如何解决这些错误并实现我想做的事情?
答案 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);
}