为什么不能更改 Erlang 静态数据结构?

Why can't Erlang static data structures be changed?

我对Erlang的理解是你有

  1. 所有数据结构都是不可变的
  2. 一些数据结构是静态的,例如记录即在编译时
  3. 一些数据结构是动态的,例如地图即在运行时

鉴于 = 所有内容都被复制,包括地图等静态数据结构

问题=为什么我们不能更改记录?

(猜猜)答案=因为记录是在头宏中定义的,它被预处理器改变了。

(猜测)不正确的答案 = 因为数据结构具有固定的内存大小(它没有)并且与 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)(除了它还检查 MyRecordfoo 记录,否则会引发 badrecord 错误)

这就是为什么您不能在运行时更改记录的元素数量的原因:处理此类记录的任何代码都需要重新编译才能访问正确的字段。这类似于如果更改结构的布局需要重新编译 C 代码的方式。