代码之家  ›  专栏  ›  技术社区  ›  Max

在对trait的引用和在Rust[duplicate]中实现该trait的结构之间转换

  •  -1
  • Max  · 技术社区  · 6 年前

    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 ,但我不知道该怎么办 &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; }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   dtolnay    6 年前

    一种安全的方法是添加一个方法 fn any(&self) -> &Any 你的trait,它携带了类型信息,使得对任意类型(在本例中)执行checked downcast成为可能 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();
    }
    
    推荐文章