我有一个特征和一个实现该特征的结构:
authorize
我的代码中有一部分包含trait A {
fn something(&self);
}
struct B {
some_field: i32,
}
impl A for B {
fn something(&self) {}
}
,并且我知道它是&A
的实例,我想将B
强制转换为&A
。我该怎么做?到目前为止,我已经尝试过先转换为&B
,然后转换为*const A
,但是我还不知道如何从*const B
转换为*const B
。
玩了一些东西之后,我认为这是正确的吗?
&B
答案 0 :(得分:1)
一种安全地执行此操作的方法是在特征中添加方法fn any(&self) -> &Any
,该方法携带类型信息,并可以将选中的向下转换为任意类型(在这种情况下为B
)
use std::any::Any;
trait A {
fn something(&self);
fn any(&self) -> &Any;
}
struct B {
some_field: i32,
}
impl A for B {
fn something(&self) {}
fn any(&self) -> &Any {
self
}
}
fn some_func(a: &dyn A) {
let b: &B = a.any().downcast_ref().unwrap();
}