【发布时间】:2019-01-07 18:41:03
【问题描述】:
我想使用 DST 并遇到以下情况
我有以下 trait 可以获取 Box 并在外部返回新的 Trait 对象:
pub trait MyTrait {
fn create_from_box(boxed: Box<Self>) -> Self
where
Self: Sized;
}
我关注不同的结构,这些结构正在实现MyTrait
结构第一结构;
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类型值的大小 - 所有局部变量都必须具有静态已知大小
我怎样才能解决这些错误并实现我想要做的事情?
【问题讨论】:
-
我不明白你在做什么。
create_from_box不会尝试返回 trait 对象,而是返回具体类型(这是不可能的,因为在编译时不知道boxed的具体类型)。 -
我正在尝试生成一个关于动态盒装类型的新具体类型。我不知道这是可能的,但如果这不可能,我该如何实现这个需求?
-
@Boiethios,我真的需要使用
as_any()和downcast_ref()吗?由于这种解决方法是先向上转换特征然后手动向下转换,我认为可能有更好的解决方案。 -
你想让
desired_trait_object拥有什么类型?
标签: rust