使用反射在运行时枚举结构的字段

时间:2015-05-22 22:56:12

标签: data-structures rust

如果我有这样的数据结构:

struct Point {
    x: i32,
    y: i32,
}

impl Point {
    fn setX(&mut self, x: i32) -> &mut Point {
        self.x = x;
        self
    }
}

是否可以遍历Point并查看每个成员和每个成员的名称?

是否也可以通过实施并查看每个功能的名称是什么?

是否可以在运行时执行上述两个任务,而无需特殊实现?

2 个答案:

答案 0 :(得分:3)

事实上,有一种方法可以(ab)使用EncodableSerialize特征来获取有关结构内容的反射信息(不过方法)。

Encodable / Serialize主要用于将结构写入某些序列化表示,例如一个JSON对象。对于任何内容也实现相应特征的结构,可以自动生成它们的实现(例如#[derive(RustcEncodable)]用于Encodable)。

这些特征的实现捕获有关结构的信息,并将其传递给EncoderSerializer的实现。后者特征的实现者通常使用这些信息(字段名称,类型和值)来序列化对象,但当然你可以编写自己的Encoder / Serializer实现,无论你想要什么,它都可以处理这些信息。 。我不是在这里提供这种实现的一个例子,因为它们往往是样板文件,但你可以通过上面的链接找到一些。

限制是您始终需要结构值才能获取有关字段的信息。您不仅可以获得任意类型的字段列表,例如Java反射允许。我认为可以编写Encoder / Serializer的内部不安全实现和类似fn type_info<T: Encodable>() -> TypeInfo的函数,它通过创建未初始化的部分来收集有关类型的信息相应类型的内存并运行其Encodable方法,但我不是百分之百确定。

答案 1 :(得分:2)

Rust在运行时并不真正支持这种反射,没有。

从理论上讲,你可能能够编写一个语法扩展,让你生成一些代码可以做这样的事情,也许......