我对Erlang的理解是你有
- 所有数据结构都是不可变的
- 一些数据结构是静态的,例如记录,即编译时
- 一些数据结构是动态的,例如 map ,即运行时
假定=所有内容都被复制,包括 map 等静态数据结构
问题 = 为什么我们不能更改记录?
(猜测)答案 = 因为记录是在 header 宏中定义的,该 header 宏由预处理器更改。
(猜测)错误答案 = 因为数据结构具有固定的内存大小(事实并非如此),并且与 C 数组不同,它不在连续内存中,而是在链表中?
最佳答案
(Guess at) Answer = because the record is defined in the header macro which is changed by the pre-processor.
这非常接近。记录是一个编译时功能:记录只是一个具有特殊布局的元组,在编译过程中所有记录操作都会转换为元组操作。
因此给出这个记录定义:
-record(foo, {a, b = default_b}).
#foo{a = x}
由编译器转换为 {foo, x, default_b}
,以及记录访问,例如 MyRecord#foo .x
变成类似于 element(MyRecord, 2)
的内容。 (除了它还检查 MyRecord
是否为 foo
记录,否则会引发 badrecord
错误)
这就是为什么您无法在运行时更改记录的元素数量:处理此类记录的任何代码都需要重新编译才能访问正确的字段。这类似于如果更改结构的布局则需要重新编译 C 代码。
关于arrays - 为什么 Erlang 静态数据结构不能改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65922826/