rust - 如何调试 downcast_ref 失败?
问题描述
由于 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());
}
解决方案
WeakWrapper<i32>
那是因为您正在向下转换为错误的类型:您正在尝试向下转换weak_wrapper
为WeakWrapper<Box<i32>>
:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f49a3c2236beabae48a41d024a04d08f
因为我无法打印 Any 来找出它实际上是什么
您可以调试打印 TypeId,尽管它不是很有帮助(您会得到一个非常不透明的数字),但可以将其与 进行比较TypeId::of::<type>()
,因此您可以这样做
any_value.type_id() == TypeId::of::<WeakWrapper<i32>>()
并发现它是false
,但是
any_value.type_id() == TypeId::of::<WeakWrapper<Box<i32>>>()
是真的。
推荐阅读
- ethereum - 如何在 ERC721 代币中添加自定义属性(链上)?
- debugging - vscode调试使用gdb,带有'-x'可选的miDebuggerArgs不支持文件中的相对路径
- sql - 如何获取部分匹配 SQL 中其他列的返回值?
- sql - Oracle - 无法更改程序
- eleventy - Eleventy - 定义摘录的起点和终点
- javascript - 有没有办法将锚标记添加到 insertCell 函数?
- docusignapi - 签名提供者对此收件人无效
- javascript - javascript通过逗号分隔符解析JSON数据
- javascript - '翻译不是功能'-反应管理中的错误与反应测试库和玩笑
- spring-boot - 我需要使用在我的主应用程序中使用的 jar 文件中创建的 bean。我尝试自动连接它,但我得到空对象