【问题标题】:Why can't Erlang static data structures be changed?为什么不能更改 Erlang 静态数据结构?
【发布时间】:2021-05-01 12:07:00
【问题描述】:

我对Erlang的理解是你有

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

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

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

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

(猜测)错误答案 = 因为数据结构具有固定的内存大小(它没有),并且与 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 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多