首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调试downcast_ref失败?

如何调试downcast_ref失败?
EN

Stack Overflow用户
提问于 2020-09-25 08:16:54
回答 1查看 145关注 0票数 1

由于Rust不支持向上转换,所以我尝试执行提到的as_any技巧这里,但是使用了参数化类型。但是,当我试图在返回的Any上调用downcast_ref时,我得到了None。因为我不能打印Any来找出它实际上是什么:

代码语言:javascript
复制
`dyn std::any::Any` doesn't implement `std::fmt::Display`

`dyn std::any::Any` cannot be formatted with the default formatter

我如何调试它的实际内容?下面是失败的代码(游乐场):

代码语言:javascript
复制
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());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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>(),所以您可以这样做。

代码语言:javascript
复制
any_value.type_id() == TypeId::of::<WeakWrapper<i32>>()

然后发现是false,但是

代码语言:javascript
复制
any_value.type_id() == TypeId::of::<WeakWrapper<Box<i32>>>()

是真的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64060387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档