Dictionary 二郎词典

Dictionary 二郎词典,dictionary,erlang,Dictionary,Erlang,我想我已经知道答案了,但我想确定一下。我正在构建一个字典作为一个静态查找表(即,字典一旦创建,它将是不可变的),并且发现这可以达到以下目的: L = [{keyA, "A"}, {keyB, "B"}, {keyC, "C"}]. D = dict:from_list(L). V = dict:fetch(keyA, D). 这是一个可以接受的方法,还是有其他我还不熟悉的魔法 作为后续,如果我要创建一个可变字典,是否真的需要考虑像这样的阴谋 D = dict:from_list(L). D1

我想我已经知道答案了,但我想确定一下。我正在构建一个字典作为一个静态查找表(即,字典一旦创建,它将是不可变的),并且发现这可以达到以下目的:

L = [{keyA, "A"}, {keyB, "B"}, {keyC, "C"}].
D = dict:from_list(L).
V = dict:fetch(keyA, D).
这是一个可以接受的方法,还是有其他我还不熟悉的魔法

作为后续,如果我要创建一个可变字典,是否真的需要考虑像这样的阴谋

D  = dict:from_list(L).
D1 = dict:append(keyD, "D", D).

最后,不是将字典从一个函数传递到另一个函数,而是有一个持久存储区,我可以按照
寄存器/2
-
whereis/1
例程的思路来存储和检索它吗?

是的,这是一种可接受的方法

如果要修改字典,始终需要从修改字典的所有操作中获取返回值,因为Erlang只有不可变的数据。这是处理所有Erlang数据的正常方法,因此您将很快习惯它


另一种方法是使用另一种存储数据的方法。根据创建ets表格的方式,您可能需要也可能不需要携带对该表格的引用。ets表中的数据不存储在进程堆中,因此访问它需要在进程和ets数据之间进行复制,但是ets表通常更擅长存储大量数据。使用dict/ORDDECT/gb_树还是ets更好,这在很大程度上取决于您打算存储的数据以及您打算对其执行的操作。

Re:ets tables,建议创建一个全局表来存储所有各种全局变量,无论它们是dict、ORDDECT、atom等,还是更倾向于说,创建一个专门用作词典的ets表?换句话说,如果我需要存储3个原子和1个dict,那么应该创建一个包含4个键的ets表(3个指向原子,1个指向键和值的dict)还是两个ets表,一个包含3个不相关的原子,另一个包含充当dict的键值。@Joe您不应该将dict存储在ets表中,因为这意味着您每次访问它时都会复制整个dict,这是一件坏事。在这种情况下,最好使用ets表而不是dict。您可以有许多ets表,并将它们用于不同的事情。如果使用命名的ets表,则所有进程都可以共享这些表。注意:ets表是数据存储,而不是数据库,因此其上的事务非常有限。有了dict,流程可以完全控制它。