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

Data structures 在运行时使用反射枚举结构的字段,data-structures,rust,Data Structures,Rust,如果我有这样的数据结构: struct Point { x: i32, y: i32, } impl Point { fn setX(&mut self, x: i32) -> &mut Point { self.x = x; self } } 是否可以迭代通过该点并查看每个成员和每个成员的名称 是否也可以通过实现查看每个函数的名称 是否可以在运行时执行上述两项任务,而无需特殊实现?Rust在运行时并不真正

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

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

impl Point {
    fn setX(&mut self, x: i32) -> &mut Point {
        self.x = x;
        self
    }
}
是否可以迭代通过该点并查看每个成员和每个成员的名称

是否也可以通过实现查看每个函数的名称


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

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


理论上,您可能能够编写一个语法扩展,让您生成一些代码来执行类似的操作,也许…

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


理论上,您可能可以编写一个语法扩展,让您生成一些代码来执行类似的操作,也许…

事实上,有一种方法可以滥用或利用特征来获取有关结构内容而不是方法的反射信息

可编码/序列化主要用于将结构写入某些序列化表示,例如JSON对象。它们的实现可以自动生成,例如,使用[deriveRustcEncodable]对其内容也实现相应特征的任何结构进行编码

这些特性的实现捕获有关结构的信息,并将其传递给or的实现。后一个特性的实现者通常使用此信息字段名称、类型和值来序列化对象,但当然,您可以编写自己的编码器/序列化器实现,它将根据您的需要处理此信息。我这里不提供这种实现的示例,因为它们往往是样板文件,但您可以通过上面的链接找到一些


限制在于,为了获取字段信息,您总是需要结构的值。您不能只获得任意类型的字段列表,例如Java反射。我认为可以编写一个内部不安全的编码器/序列化器实现,以及一个类似fn type_info->TypeInfo的函数,该函数通过创建相应类型的未初始化内存并运行其可编码方法来收集有关类型的信息,但我不能100%确定这一点。

事实上,不过,有一种方法可以滥用或利用特征来获得关于结构内容的反射信息,而不是方法

可编码/序列化主要用于将结构写入某些序列化表示,例如JSON对象。它们的实现可以自动生成,例如,使用[deriveRustcEncodable]对其内容也实现相应特征的任何结构进行编码

这些特性的实现捕获有关结构的信息,并将其传递给or的实现。后一个特性的实现者通常使用此信息字段名称、类型和值来序列化对象,但当然,您可以编写自己的编码器/序列化器实现,它将根据您的需要处理此信息。我这里不提供这种实现的示例,因为它们往往是样板文件,但您可以通过上面的链接找到一些


限制在于,为了获取字段信息,您总是需要结构的值。您不能只获得任意类型的字段列表,例如Java反射。我认为有可能编写一个内部不安全的编码器/序列化器实现,以及一个类似fn type_info->TypeInfo的函数,该函数通过创建相应类型的未初始化内存并运行其可编码方法来收集有关类型的信息,但我不是100%确定。

FYI您尝试做的事情通常属于“反射”一词。@delnan有没有更好的方法来表达我的标题/帖子?我只会使用pub struct字段。也许一个tuple struct.FYI你要做的通常是在术语reflection下。@delnan有没有更好的方法来表达我的标题/帖子?我只会使用pub struct字段。也许还有一个元组结构。为了澄清为什么Rust不能为方法完成同样的事情:Rust没有Java或C这样的虚拟机计数器部件。它只编译成汇编,并且在创建对象时没有与对象一起存储的类型信息。为了澄清为什么Rust不能为方法完成相同的任务:Rust没有Java或C之类的虚拟机计数器部件。它只编译为汇编,在创建对象时没有与对象一起存储的类型信息。