为啥 Erlang 字符串不能用作 ets 表名?

Posted

技术标签:

【中文标题】为啥 Erlang 字符串不能用作 ets 表名?【英文标题】:why Erlang string can't used as ets table name?为什么 Erlang 字符串不能用作 ets 表名? 【发布时间】:2018-09-14 03:29:34 【问题描述】:

我是动态创建 ets 表,所以最好避免使用 atom 作为名称。 简单使用字符串作为名称,如::ets.new("aaa", [:named_table])

但是无法编译:

** (ArgumentError) argument error
    (stdlib) :ets.new("aaa", [])

【问题讨论】:

【参考方案1】:

如果您要动态创建 ETS 表,一种方法是将它们创建为未命名的表,并使用 :ets.new 返回的表 ID 来访问它们:

iex(1)> table1 = :ets.new(:foo, [])
8212
iex(2)> table2 = :ets.new(:foo, [])
12309
iex(3)> :ets.insert(table1, :a, 1)
true
iex(4)> :ets.insert(table2, :a, 2)
true
iex(5)> :ets.lookup(table1, :a)
[a: 1]
iex(6)> :ets.lookup(table2, :a)
[a: 2]

(在 Erlang/OTP 20.0 中,表 id 是引用而不是整数,但它的工作方式相同;请参阅 this question。)

【讨论】:

谢谢。看来我会得到一个参考类型。顺便说一句,我可以将引用转换为字符串以将 ID 响应给客户端吗?而且,我想要一个字符串转换为一个pid。或者我必须创建另一个ets来记录string_name, reference的地图? erlang:ref_to_listerlang:list_to_ref,但是文档说“这个 BIF 用于调试,不能在应用程序中使用”,所以我会使用来自的显式映射对引用的响应 ID。 虽然不知道为什么不推荐。我愿意遵循良好的做法。保存到地图似乎是一种正常的方式,没有魔法;-)

以上是关于为啥 Erlang 字符串不能用作 ets 表名?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 Windows 中启动命名 Erlang 节点?

Erlang ets插入多个表

从 ets:lookup() 中提取值 - Erlang

Erlang - ETS 表之间的比较

有没有办法浏览 erlang 术语存储 (ETS)

Erlang ETS 内存碎片