【问题标题】:Why can't Erlang static data structures be changed?为什么不能更改 Erlang 静态数据结构?
【发布时间】:2021-05-01 12:07:00
【问题描述】:
我对Erlang的理解是你有
- 所有数据结构都是不可变的
- 一些数据结构是静态的,例如记录,即在编译时
- 一些数据结构是动态的,例如地图,即在运行时
鉴于 = 复制所有内容,包括地图等静态数据结构
问题 = 为什么我们不能更改记录?
(猜测)答案 = 因为记录是在由预处理器更改的标头宏中定义的。
(猜测)错误答案 = 因为数据结构具有固定的内存大小(它没有),并且与 C 数组不同,它不在连续内存中,而是在链表中?
【问题讨论】:
标签:
arrays
dynamic
static
erlang
record
【解决方案1】:
(猜测)答案 = 因为记录是在由预处理器更改的标头宏中定义的。
这非常接近。记录是编译时的特性:记录只是一个具有特殊布局的元组,在编译过程中所有记录操作都转换为元组操作。
所以给定这个记录定义:
-record(foo, {a, b = default_b}).
#foo{a = x} 被编译器转换为{foo, x, default_b},并且诸如MyRecord#foo.x 之类的记录访问变为类似于element(MyRecord, 2)。 (除了它还检查MyRecord 是否为foo 记录,否则会引发badrecord 错误)
这就是您无法在运行时更改记录元素数量的原因:处理此类记录的任何代码都需要重新编译才能访问正确的字段。这类似于如果更改结构的布局需要重新编译 C 代码。