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

标签 arrays dynamic static erlang record

我对Erlang的理解是你有

  1. 所有数据结构都是不可变的
  2. 一些数据结构是静态的,例如记录,即编译时
  3. 一些数据结构是动态的,例如 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/

相关文章:

arrays - 任意 365 天期间的总和值

javascript 按内部数据对数组进行排序

c - 查找字符串中的第一个非重复字符

jsf - 以编程方式实例化 ValueExpression

java - 从对象和类本身调用静态函数之间的区别

javascript - 如何使用扩展语法删除第一个数组元素

c# - dynamic (C# 4) 和 var 有什么区别?

html - 根据内容展开DIV

Java静态嵌套类与顶级类

c - 静态全局变量和函数内部静态变量的区别