在对特征的引用和在Rust中实现该特征的结构之间转换

时间:2018-09-09 19:24:26

标签: rust

我有一个特征和一个实现该特征的结构:

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

1 个答案:

答案 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();
}