是否有可能在运行时定义structs或以其他方式实现类似的效果



我想创建一个函数(用于库),它将为任何包含所有列及其数据的CSV输出一个结构。这意味着直到运行时才会知道列名(除非用户明确提供)。

是否可以在运行时创建结构定义或更改现有结构?如果是,如何?

例如,我如何更改以下结构:

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

至以下(仅在存储器中):

struct Point {
x: String,
y: String,
z: String,
}

这种行为在Python等语言中是可能的,但我不确定在Rust等编译语言中是否可能。

不,这是不可能的。

简化后,在编译时,计算每个结构的布局(排序、偏移量、填充等),从而可以知道结构的大小。当生成代码时,所有这些高级信息都被丢弃,并且机器代码知道要将X字节跳到访问字段foo中。

Rust可执行文件中不存在将源代码转换为机器代码的任何机制。如果是这样的话,每个Rust可执行文件可能会增加几百兆字节(当前Rust工具链的重量为300MB以上)。

其他语言通过共享运行时或解释器来解决这一问题。例如,如果不首先安装共享Python解释器,就无法获取Python源文件并运行它。

此外,Rust是一种静态类型的语言。当您有一个值时,您就可以确切地知道哪些字段和方法是可用的。动态生成的结构无法做到这一点——在编写试图使用字段/方法的代码时,无法判断字段/方法是否真的存在


正如评论中所指出的,动态数据需要一个动态数据结构,例如HashMap

最新更新