在对特征的引用和在Rust中实现该特征的结构之间转换
我有一个特性和一个实现该特性的结构:在对特征的引用和在Rust中实现该特征的结构之间转换,rust,Rust,我有一个特性和一个实现该特性的结构: trait A { fn something(&self); } struct B { some_field: i32, } impl A for B { fn something(&self) {} } 我的代码中有一部分有一个&a,我知道它是B的一个实例,我想将&a转换为&B。我怎样才能做到这一点?到目前为止,我已经尝试过先向*常量A施放,然后向*常量B施放,但我不知道如何从*常量B到&B 在玩弄了一些东西之
trait A {
fn something(&self);
}
struct B {
some_field: i32,
}
impl A for B {
fn something(&self) {}
}
我的代码中有一部分有一个&a
,我知道它是B
的一个实例,我想将&a
转换为&B
。我怎样才能做到这一点?到目前为止,我已经尝试过先向*常量A
施放,然后向*常量B
施放,但我不知道如何从*常量B
到&B
在玩弄了一些东西之后,我认为这是正确的
fn some_func(a: &dyn A) {
let a_ptr = a as *const A;
let b_ptr = a_ptr as *const B;
unsafe { let b = &*b_ptr as &B; }
}
安全地做到这一点的一种方法是向您的trait添加一个方法
fn any(&self)->&any
,该方法携带类型信息,并可以对任意类型执行选中的向下转换(在本例中为B
)
“在玩弄了一些东西之后,我认为这是正确的?”这并不是我将这种东西称为生锈的方式。但是,是的,这将“编译”,也许如果你添加一点产生
a
的代码,我们可以找到解决问题的方法。如果你有一个&a
,并且你知道它是B
的一个实例,为什么你不能证明它是--也就是说,使用&B
?当然,“有趣”是描述未定义行为的一种方式。enum
是Rust所称的标记联合…
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();
}