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

Nic*_*ake 2 arrays erlang static record dynamic

我对 Erlang 的理解是你有

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

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

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

(猜测)答案 = 因为记录是在由预处理器更改的标头宏中定义的。

(猜一猜)不正确的答案 = 因为数据结构具有固定的内存大小(它没有),并且与 C 数组不同,它不在连续内存中,而是在一个链表中?

leg*_*cia 5

(猜测)答案 = 因为记录是在由预处理器更改的标头宏中定义的。

那非常接近。记录是一个编译时特性:记录只是一个具有特殊布局的元组,在编译期间所有记录操作都转换为元组操作。

因此,鉴于此记录定义:

-record(foo, {a, b = default_b}).
Run Code Online (Sandbox Code Playgroud)

#foo{a = x}{foo, x, default_b}由编译器转换为,并且MyRecord#foo.x诸如element(MyRecord, 2). (除了它还检查这MyRecord是一条foo记录,badrecord否则会引发错误)

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