由于Rust不支持向上转换,所以我尝试执行提到的as_any技巧这里,但是使用了参数化类型。但是,当我试图在返回的Any上调用downcast_ref时,我得到了None。因为我不能打印Any来找出它实际上是什么:
`dyn std::any::Any` doesn't implement `std::fmt::Display`
`dyn std::any::Any` cannot be formatted with the default formatter我如何调试它的实际内容?下面是失败的代码(游乐场):
use std::any::Any;
use std::rc::{Rc, Weak};
pub trait Wrapper: Any {
fn as_any(&self) -> &dyn Any;
}
pub struct WeakWrapper<T: Any> {
item: Weak<T>,
}
impl<'a, T: Any + 'static> Wrapper for WeakWrapper<T> {
fn as_any(&self) -> &dyn Any {
self
}
}
fn main() {
let rc = Rc::new(Box::new(5));
let weak_wrapper = WeakWrapper {
item: Rc::downgrade(&rc),
};
let item = weak_wrapper
.as_any()
.downcast_ref::<WeakWrapper<i32>>()
.map(|w| w.item.upgrade().map(|n| *n))
.flatten();
println!("Item is {}", item.unwrap());
}发布于 2020-09-25 08:57:02
这是因为你的选择是错误的:你想要降到WeakWrapper<i32>,但是weak_wrapper是一个WeakWrapper<Box<i32>>:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f49a3c2236beabae48a41d024a04d08f
因为我不能打印任何东西来找出它到底是什么
您可以调试-打印TypeId,虽然它不是很有帮助(您得到一个相当不透明的数字)它可以比较TypeId::of::<type>(),所以您可以这样做。
any_value.type_id() == TypeId::of::<WeakWrapper<i32>>()然后发现是false,但是
any_value.type_id() == TypeId::of::<WeakWrapper<Box<i32>>>()是真的。
https://stackoverflow.com/questions/64060387
复制相似问题