是否可以在运行时定义结构或以其他方式实现类似的效果?

Gre*_*reg 7 struct runtime rust

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

是否可以在运行时创建结构定义或改变现有结构?如果是这样,怎么样?

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

struct Point {
    x: String,
    y: String,
}
Run Code Online (Sandbox Code Playgroud)

对于以下内容(仅在内存中):

struct Point {
    x: String,
    y: String,
    z: String,
}
Run Code Online (Sandbox Code Playgroud)

这种行为在Python等语言中是可行的,但我不确定它是否可以在Rust等编译语言中使用.

She*_*ter 9

不,这是不可能的.

简化,在编译时,计算每个结构的布局(排序,偏移,填充等),允许结构的大小已知.生成代码时,抛弃所有这些高级信息,机器代码知道将X字节跳转到访问字段foo.

将源代码转换为机器代码的这种机制都不存在于Rust可执行文件中.如果是这样,每个Rust可执行文件可能会获得几百兆字节(当前的Rust工具链的重量为300 + MB).

其他语言通过拥有共享的运行时或解释器来解决这个问题.例如,如果没有先安装共享的Python解释器,就无法获取Python源文件并运行它.

另外,Rust是一种静态类型语言.当您有值时,您确切知道哪些字段和方法可用.使用动态生成的结构无法做到这一点 - 当您编写试图使用它的代码时,无法确定字段/方法是否实际存在.


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