我想访问我的log::Log
个Impl实例以访问特定的字段,但一旦我收到引用,我就不能将其向下转换到我的 struct 中.
我试图将记录器引用转换为core::any::Any
,然后将其向下转换为我的原始 struct ,但我总是得到None
.
use core::any::Any;
pub trait AToAny: 'static {
fn as_any(&self) -> &dyn Any;
}
impl<T: 'static> AToAny for T {
fn as_any(&self) -> &dyn Any {
self
}
}
struct MyLogger {}
impl log::Log for MyLogger {
fn enabled(&self, _: &log::Metadata<'_>) -> bool { todo!() }
fn log(&self, _: &log::Record<'_>) { todo!() }
fn flush(&self) { todo!() }
}
pub fn main() {
let logger_impl = MyLogger {};
log::set_boxed_logger(Box::new(logger_impl)).unwrap();
let logger = log::logger();
let logger_any = logger.as_any();
let logger_impl = logger_any.downcast_ref::<MyLogger>()
.expect("downcast failed");
}
我也try 了,但没有通过日志(log)初始化函数,但我得到了相同的结果:
use core::any::Any; // 0.10.1
pub trait AToAny: 'static {
fn as_any(&self) -> &dyn Any;
}
impl<T: 'static> AToAny for T {
fn as_any(&self) -> &dyn Any {
self
}
}
struct MyLogger {}
impl log::Log for MyLogger {
fn enabled(&self, _: &log::Metadata<'_>) -> bool { todo!() }
fn log(&self, _: &log::Record<'_>) { todo!() }
fn flush(&self) { todo!() }
}
pub fn main() {
let logger_impl = MyLogger {};
let logger_boxed: Box<MyLogger> = Box::new(logger_impl);
let logger: &'static mut dyn log::Log = Box::leak(logger_boxed);
let logger_any = logger.as_any();
let logger_impl = logger_any.downcast_ref::<MyLogger>()
.expect("downcast failed");
}
我看到logger
变量中的type_id
与logger_impl
中的type_id
不同,所以我相信这就是阻止我进行向下预测的原因,但我不能理解我应该如何修复这个问题.