Rust具有这种Any特性,但它也有"不支付你不使用的"政策.Rust如何实现反射?
我的猜测是Rust使用了懒惰标记.每个类型最初都是未分配的,但是稍后如果将类型的实例传递给期望Any特征的函数,则为该类型分配一个TypeId.
或者Rust TypeId可能会在其实例可能传递给该函数的每种类型上放置一个?我想前者会很贵.
有没有办法在Rust中打印出类型或实例的可用成员的完整列表?
如果问这个问题是Python,那么答案就是print(dir(object)).
如果问题是C,那么Clang有一个Python API可以解析C代码并对其进行内省.
不熟悉Rust工具,我很想知道是否有某种方法可以在运行时或编译时,使用编译器功能(例如宏)或使用外部工具来执行类似的操作.
请注意,这个问题是故意的,因为使用的确切方法不一定非常重要.给定一个变量,是否有办法找到它的所有方法和功能并不是一个不寻常的目标,但不能很好地了解这个领域,我不是将问题局限于特定方法.
我有大约10个结构,每个结构之间有5-10个字段,我希望能够使用相同的格式将它们打印出来。
我的大多数结构如下所示:
struct Example {
a: Option<String>,
b: Option<i64>,
c: Option<String>,
... etc
}
Run Code Online (Sandbox Code Playgroud)
我希望能够定义一个implfor,fmt::Display而不必再次枚举字段,因此,如果添加了新字段,就不会丢失一个字段。
对于结构:
let eg = Example{
a: Some("test".to_string),
b: Some(123),
c: None,
}
Run Code Online (Sandbox Code Playgroud)
我想要输出格式:
a: test
b: 123
c: -
Run Code Online (Sandbox Code Playgroud)
我目前正在使用,#[derive(Debug)]但我不喜欢它打印出来Some(X)以及None其他一些东西。
如果我知道结构中的所有值都是Option<T: fmt::Display>我可以生成自己的Display方法而不必再次列出字段?