gpt4 book ai didi

rust - 如何调试downcast_ref故障?

转载 作者:行者123 更新时间:2023-12-03 11:33:54 28 4
gpt4 key购买 nike

由于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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com