【发布时间】:2015-10-23 15:13:30
【问题描述】:
我看到的大多数书籍或在线资源都使用记录来保存流程的状态(可能是因为这种方式已经超过(?)十年了)。另一方面,映射有效地用于替换标准库中的元组(例如childspecs in the supervisor module)。
例如,我正在阅读Learn You Some Erlang's Finite State Machines 章节,state 记录可以替换为在gen_fsm 所需的init/1 回调中声明的映射。
- 不需要记录声明,到目前为止我读过的大部分内容,最佳做法是将它们保留在本地,因为
.hrl文件使跟踪错误变得更加困难。 - 在函数子句中引用进程状态也会更短,但它们都清楚地传达了状态变量的结构,并且不需要考虑额外的几个字符。
另外,它会更有效吗?
我知道一个经过深思熟虑的基准可以回答我的问题,但我只需要几周的时间来学习 Erlang 并且 maps module 是相当新的并且仍然是 changing。
更新:感谢我提供了非常糟糕的建议,我更彻底地阅读了LYSE chapter on maps,答案很明确:
使用记录的优点是在编译时就知道键 时间带来的优势
- 快速访问特定值(比动态访问更快)
- 额外的安全性(提前崩溃而不是破坏状态)
- 更简单的类型检查
这些使记录绝对适合进程的内部状态,尽管偶尔会产生编写更冗长的负担 code_change 函数。
另一方面,Erlang 用户会使用记录来表示 复杂的嵌套键/值数据结构(奇怪地类似于 经常跨模块的面向对象语言) 边界,地图会有很大帮助。记录是错误的工具 工作。
【问题讨论】:
-
为主管子规范使用映射还允许它们在未提供键时提供默认值,例如重新开始;这可以减少所需的样板数量
标签: erlang