Rust 无法从 Any 扩展的特征对象 downcast_ref

Zip*_*Sun 3 rust

这是示例代码的 Rust Playground。

use std::any::Any;

pub trait MemorizedOutput: Any {
    fn as_any(&self) -> &dyn Any;
}

impl<T: Any> MemorizedOutput for T {
    fn as_any(&self) -> &dyn Any {
        self
    }
}

fn main() {
    let a = Box::new(1i32) as Box<dyn MemorizedOutput>;
    println!("{}", a.as_any().downcast_ref::<i32>().unwrap());
}
Run Code Online (Sandbox Code Playgroud)

为什么上面的代码在unwrap().

小智 5

Box<dyn MemorizedOutput>实施Any,因此它被覆盖在 的总体实施范围内MemorizedOutput。根据https://doc.rust-lang.org/reference/expressions/method-call-expr.html,Rust更喜欢在Box<dyn MemorizedOutput>取消引用的类型之前实现的方法dyn MemorizedOutputa.as_any()其实也是如此,<Box<dyn MemorizedOutput> as MemorizedOutput>::as_any(&a)这显然是不能掉以轻心的i32