代码之家  ›  专栏  ›  技术社区  ›  Ethan McTague

Rust:将电弧<dyn Trait>提升为电弧<dyn-Any>?

  •  1
  • Ethan McTague  · 技术社区  · 3 年前

    假设我有一个类型为的特质对象 Asset ,存储在 Arc ,我想将其转换为 Arc<dyn Any> 以便于以后的下广播。

    有什么安全的方法吗?我尝试过这种(不安全的)策略,使用 as-any 板条箱,但它似乎破坏了类型信息,因为我做不到 downcast 结果 弧形<dyn任意> 到其基本类型:

        let res: Box<dyn Asset> = thing_that_returns_dyn_asset();
        let res: Arc<dyn Asset> = Arc::from(res);
    
        // Unsafe: Cast an Arc<dyn Asset> to an Arc<dyn Any>.
        let res : Arc<dyn Any> = unsafe {
             Arc::from_raw(Arc::into_raw(res).as_any())
        };
    

    但这似乎并不奏效。我知道目前有一个向上投射对象的实验功能,但这似乎没有帮助。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Chayim Friedman    3 年前

    最简单的方法是添加一个方法,该方法从 Arc<Asset> Arc<dyn Any> 下列的 as-any ,我们可以在自定义特性中做到这一点,并对其进行全面实现:

    pub trait AsAnyArc {
        fn as_any_arc(self: Arc<Self>) -> Arc<dyn Any>;
    }
    
    impl<T: 'static> AsAnyArc for T {
        fn as_any_arc(self: Arc<Self>) -> Arc<dyn Any> { self }
    }
    
    pub trait Asset: AsAnyArc { ... }
    
    let res: Box<dyn Asset> = thing_that_returns_dyn_asset();
    let res: Arc<dyn Asset> = Arc::from(res);
    
    let res: Arc<dyn Any> = res.as_any_arc();