Erlang - Global Variables ..是的,我知道,我知道

BAR*_*BAR 6 erlang global

好的,我一直在尝试各种方法来解决这个问题.

我需要让这个表成为一个全局的...我已经意识到在我的程序范围内传递TableID的效率要低得多.

所以我尝试创建一个新表然后查找它:

TableID = ets:new(tb, [set,public]),
put({tableUniqueID}, TableID),
Run Code Online (Sandbox Code Playgroud)

然后我用了:

get({tableUniqueID})
Run Code Online (Sandbox Code Playgroud)

并且在同一个函数中它返回TableID就好......但是当我在另一个函数中使用它时,它返回一个未定义的.

什么??我认为得到并把它作为一个关键的全球..

在此之前,我意识到你"可以"调用表查找函数:

ets:lookup(get({tableUniqueID}), msgIn)
Run Code Online (Sandbox Code Playgroud)

同样的事情,在功能工作,外面没有..得到问题..

然后我意识到查找表的另一种方法是调用表的原子

ets:lookup(tb, msgIn)
Run Code Online (Sandbox Code Playgroud)

但这永远不会工作,不是在功能内部,不是...

所以我的主要优先事项是弄清楚为什么用原子查找表是不可能的.但它表示它无处不在,包括手册.

get/put我可以没有,只要我可以存储表,然后通过其原子标识符查找表.

任何人都可以解释这个困境吗?

BAR*_*BAR 6

我知道了!!

希望文档,会在查找函数下说这个..更好的是,每个人都在ets上写教程,或者更多的是如此书籍

解决方案是

TableID = ets:new(tb, [set,public,named_table])
Run Code Online (Sandbox Code Playgroud)

named_table是重要的部分

有些人在挖掘手册页,但是

;)


Dan*_*una 5

问题的正确答案是根本不使用全局表,而是传递信息.特别是因为你在原始问题中提到了效率.您正在代码中创建拥塞点,这将使其在任何多核计算机上的性能更差.

ets表实现为所有其他进程必须调用以获取值的进程.