【问题标题】:Is it possible to define structs at runtime or otherwise achieve a similar effect?是否可以在运行时定义结构或以其他方式实现类似的效果?
【发布时间】:2017-11-07 13:40:17
【问题描述】:

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

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

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

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

到以下(仅在内存中):

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

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

【问题讨论】:

标签: struct rust runtime


【解决方案1】:

不,这是不可能的。

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

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

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

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


正如cmets中所指出的,动态数据需要动态数据结构,比如HashMap

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多