作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于Rust不支持向上转换,因此我尝试执行here提到的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
我该如何调试它的实际含义?这是失败的代码(
playground):
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
Since I cannot print Any to find out what it actually is
TypeId::of::<type>()
进行比较,因此您可以执行例如
any_value.type_id() == TypeId::of::<WeakWrapper<i32>>()
并发现它是
false
,但是
any_value.type_id() == TypeId::of::<WeakWrapper<Box<i32>>>()
是真的。
关于rust - 如何调试downcast_ref故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64060387/
我遇到了与 Rust 的所有权规则和特征对象向下转换的冲突。这是一个示例: use std::any::Any; trait Node{ fn gen(&self) -> Box; } str
我正在尝试创建自己的模拟框架,但遇到了这个问题。当我尝试向下转换我的 Any 类型时,它没有找到 downcast_ref 方法: use std::any::Any; use std::collec
我是一名优秀的程序员,十分优秀!