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

时间:2018-04-04 14:08:00

标签: erlang elixir ets

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

但它无法编译:

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

1 个答案:

答案 0 :(得分:4)

如果您正在动态创建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。)