Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在对特征的引用和在Rust中实现该特征的结构之间转换_Rust - Fatal编程技术网

在对特征的引用和在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();
}