2 个不稳定版本
0.1.0 | 2022年12月15日 |
---|---|
0.0.0 | 2022年11月7日 |
#1367 在 Rust 模式
160KB
4K SLoC
deflect
[实验性] Deflect 通过 DWARF 调试信息将反射引入 Rust。
Deflect 可用于恢复特例对象的具体类型,检查异步生成器的内部状态,以及格式化打印任意数据。
示例
使用 Reflect
特性来调试或递归地解构任何值。
pub struct Foo {
a: u8
}
// initialize the debuginfo provider
let context = deflect::default_provider()?;
// create some type-erased data
let erased: Box<dyn Any> = Box::new(Foo { a: 42 });
// cast it to `&dyn Reflect`
let reflectable: &dyn deflect::Reflect = &erased;
// reflect it!
let value: deflect::Value = reflectable.reflect(&context)?;
// pretty-print the reflected value
assert_eq!(value.to_string(), "box Foo { a: 42 }");
// downcast into a `BoxedDyn` value
let value: deflect::value::BoxedDyn = value.try_into()?;
// dereference the boxed value
let value: deflect::Value = value.deref()?;
// downcast into a `Struct` value
let value: deflect::value::Struct = value.try_into()?;
// get the field `a` by name
let Some(field) = value.field("a")? else {
panic!("no field named `a`!")
};
// get the value of the field
let value = field.value()?;
// downcast into a `u8`
let value: u8 = value.try_into()?;
// check that it's equal to `42`!
assert_eq!(value, 42);
查看此包源代码的 examples
目录以获取更多示例。
限制
当前 default_provider
实现仅在 DWARF 调试信息存储在程序的二进制文件中时才有效。如果 DWARF 调试信息拆分到其他文件中,则不会有效。欢迎提交拉取请求。
此包高度实验性。它不适合作为任何系统的关键组件。此包的初始版本需要大量润色。欢迎提交拉取请求。已知的可靠性漏洞包括对 UnsafeCell
的未知。不要在包含 UnsafeCell
的类型上反射。
此外,Rust 编码 DWARF 调试信息的细节可能会随时间而变化。此包将尽力跟上这些变化。再次欢迎提交拉取请求。
许可证
本项目根据 Apache 许可证版本 2.0 或 MIT 许可证进行许可,由您选择。
贡献
除非您明确声明,否则您提交的任何有意包含在 deflect 中的贡献都将根据 MIT 和 Apache 2.0 许可证进行许可,不附加任何其他条款或条件。
依赖
~5–11MB
~122K SLoC