是否可以在运行时定义结构或以其他方式实现类似的效果?
Is it possible to define structs at runtime or otherwise achieve a similar effect?
我想创建一个函数(用于库),它将为包含所有列及其数据的任何 CSV 输出一个结构。这意味着列名(除非用户明确提供)直到运行时才知道。
是否可以在运行时创建结构定义或改变现有结构?如果可以,怎么做?
例如,我如何改变以下结构:
struct Point {
x: String,
y: String,
}
致以下(仅在内存中):
struct Point {
x: String,
y: String,
z: String,
}
这种行为在 Python 等语言中是可能的,但我不确定在 Rust 等编译语言中是否可能。
不,不可能。
简化,在编译时,计算每个结构的布局(排序、偏移、填充等),允许知道结构的大小。生成代码时,所有这些高级信息都被丢弃,机器代码知道将 X 字节跳转到访问字段 foo
.
None 这种将源代码转换为机器代码的机制存在于 Rust 可执行文件中。如果是这样,每个 Rust 可执行文件可能会增加数百兆字节(当前的 Rust 工具链重达 300+MB)。
其他语言通过共享运行时间或解释器来解决这个问题。例如,如果不先安装共享的 Python 解释器,就不能使用 Python 源文件和 运行 它。
此外,Rust 是一种静态类型 语言。当你有一个值时,你就会确切地知道哪些字段和方法是可用的。使用动态生成的结构无法做到这一点——当您编写尝试使用它的代码时,无法判断 field/method 是否实际存在。
评论中指出,动态数据需要动态数据结构,比如HashMap
.
我想创建一个函数(用于库),它将为包含所有列及其数据的任何 CSV 输出一个结构。这意味着列名(除非用户明确提供)直到运行时才知道。
是否可以在运行时创建结构定义或改变现有结构?如果可以,怎么做?
例如,我如何改变以下结构:
struct Point {
x: String,
y: String,
}
致以下(仅在内存中):
struct Point {
x: String,
y: String,
z: String,
}
这种行为在 Python 等语言中是可能的,但我不确定在 Rust 等编译语言中是否可能。
不,不可能。
简化,在编译时,计算每个结构的布局(排序、偏移、填充等),允许知道结构的大小。生成代码时,所有这些高级信息都被丢弃,机器代码知道将 X 字节跳转到访问字段 foo
.
None 这种将源代码转换为机器代码的机制存在于 Rust 可执行文件中。如果是这样,每个 Rust 可执行文件可能会增加数百兆字节(当前的 Rust 工具链重达 300+MB)。
其他语言通过共享运行时间或解释器来解决这个问题。例如,如果不先安装共享的 Python 解释器,就不能使用 Python 源文件和 运行 它。
此外,Rust 是一种静态类型 语言。当你有一个值时,你就会确切地知道哪些字段和方法是可用的。使用动态生成的结构无法做到这一点——当您编写尝试使用它的代码时,无法判断 field/method 是否实际存在。
评论中指出,动态数据需要动态数据结构,比如HashMap
.