在 GenServer 中
def init(_opts \\ []) do
table = :ets.new(:my_table, [:duplicate_bag, :public])
{:ok, %{}}
end
def add_player(zone_id, socket_id) do
:ets.thing(
:my_table,
{some_key, [my_uuid]}
)
end
但是我明白
the table identifier does not refer to an existing ETS table
这是一个公共表,我知道 init 在测试执行之前被调用,因为我登录了那里。
我不确定 ets 为什么要这样做。
为了通过名称引用表,您需要在创建表时将其设为命名表:
table = :ets.new(:my_table, [:duplicate_bag, :public, :named_table])
如果没有
:named_table
,则需要使用:ets.new
返回的引用来访问表。
(另请注意,如果创建该表的进程终止,该表将被删除,但这似乎不是这里发生的情况。)