【发布时间】:2019-02-05 06:36:06
【问题描述】:
如果不存在,我想在 ets 中创建一个表。如何检查这个名字是否存在?
【问题讨论】:
-
我建议在 try..catch 表达式中创建它。
如果不存在,我想在 ets 中创建一个表。如何检查这个名字是否存在?
【问题讨论】:
您可以使用:ets.whereis/1。如果命名表不存在,它将返回:undefined:
iex(1)> :ets.new :foo, [:named_table]
:foo
iex(2)> :ets.whereis :foo
#Reference<0.2091350666.119668737.256142>
iex(3)> :ets.whereis :bar
:undefined
【讨论】:
:ets.info(:foo)。
ets:whereis 是在 Erlang/OTP 21.0 中引入的。
如果你使用的是旧版本的 Erlang,你可以创建一个查找函数:
def lookup(server, name) do
case :ets.lookup(server, name) do
[{^name, pid}] -> {:ok, pid}
[] -> :error
end
end
信息来自:https://elixir-lang.org/getting-started/mix-otp/ets.html
【讨论】:
badarg 错误。
最好的办法就是查看该表是否在所有表的列表中。像这样简单的检查应该是好的:
lists:member(table_name,ets:all())
这会返回一个简单的 boolean(),您可以在案例中使用它来作为操作的基础。
【讨论】:
这应该可以解决问题:
def create_table? do if Enum.member?(:ets.all(), :my_table) == false do :ets.new(:my_table, [:public, :named_table]) end end
【讨论】: