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

时间:2017-11-07 13:40:18

标签: struct rust runtime

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

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

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

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

以下内容(仅限内存):

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

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

1 个答案:

答案 0 :(得分:7)

不,这是不可能的。

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

在Rust可执行文件中,没有任何将源代码转换为机器代码的机器。如果是这样,每个Rust可执行文件可能会获得几百兆字节(当前的Rust工具链的重量为300 + MB)。

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

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

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