rust - 如何调试downcast_ref故障?

标签 rust

由于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_wrapperWeakWrapper<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,尽管它不是很有用(您获得了一个非常不透明的数字),但可以将其与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 - 我如何使用特征方法的默认实现而不是类型的自定义实现?

rust - 如何匹配从标准输入读取的字符串?

rust - 另一个 Rust 泛型练习

rust - 你如何在 Rust 中创建一个具有需要生命周期的特征的泛型函数?

arrays - 如何将数组强制转换为匹配臂中的切片?

rust - 为什么一个变量可以绑定(bind)到另一个值,即使它的所有权已经移动?

rust - 不能对返回 Result<(), error> 的函数使用 `?` 运算符

struct - Rust 结构无法替换 HashMap 中的特征

rust - 添加到基于 RefCell 构建的二叉树时,借用的值不会存在足够长的时间

rust - 初始化函数在 `lazy_static` block 中被调用两次