
图片:Rust 反射 MVP 拉取请求已合并到 rust-lang/main,标志着编译时反射功能取得了进展。
你有没有写过一个通用函数,然后心想:“天哪,我怎么才能在编译时直接问编译器‘嘿,T 到底是什么?’?“那样我的生活至少能轻松 42%。
经过四个月的实现和架构决策,Rust 大神们刚刚发布了一个闪亮的新 nightly 玩具: std::mem::type_info 。
这个全新的实验性功能(通过 #![feature(type_info)] 实现)通过一个常量函数提供实际的编译时反射,该函数会输出一个描述类型(Type)的结构体。
目前它还是一个超级 MVP,主要用于元组(例如字段计数、偏移量、递归到元素),具有基本的 TypeKind 变体,如 Tuple、Leaf(原始类型)或 Other(目前还不完善的所有其他类型)。
在常量上下文中调用 Type::of::<T>(),即可获得大小信息、类型和元组详细信息,而无需任何运行时成本或繁琐的 proc-macro 操作。
最酷的是什么?
这是在 std 中实现真正意义上的常量友好型自省的第一步,这意味着更智能的泛型代码、更好的错误信息,甚至可能实现元组解包或自动派生,而无需纯粹依靠宏技巧。
问题在于?
现在还处于非常早期的阶段,不要指望会有结构体字段、枚举变体或特性(trait )信息。
目前的实现方式基本上是“要么使用元组,要么就别用”,其他任何方式都只能礼貌地耸耸肩。
不过,这对于语言团队来说是一个重要的信号:反射即将到来,而且不会再像以前那样耗时 10 年进行内部讨论。
对于我们开发者来说,这很重要,因为它让我们离编写通用代码更近了一步,编写出来的代码感觉不像是在与借用检查器作斗争,而更像是编程。
想象一下,调试打印功能、序列化器或访问者模式能够真正知道它们正在查看什么,而无需面对大量的特性边界。
谁能想到,自我反射竟然会在我们2026年待办事项清单的一半完成之前到来?
向 Oli、Ralf、Boxy、Tim、Josh 以及所有参与制作第一款 MVP 的工作人员致以崇高的敬意。