如何检查ETS Erlang/Elixir中是否存在命名表

oymdgrw7  于 2022-12-08  发布在  Erlang
关注(0)|答案(4)|浏览(213)

我想在ets中创建一个表,如果它不存在的话。我怎样才能检查这个名字是否存在呢?

xe55xuns

xe55xuns1#

可以使用: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
hlswsv35

hlswsv352#

如果您使用的是旧版本的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

fnatzsnv

fnatzsnv3#

您最好的方法就是查看该表是否在所有表的列表中。像这样简单的检查应该是好的:

lists:member(table_name,ets:all())

这将返回一个简单的布尔值(),您可以在案例中使用该值作为操作的基础。

fwzugrvs

fwzugrvs4#

这样就可以了:

def create_table? do 
  if Enum.member?(:ets.all(), :my_table) == false do
      :ets.new(:my_table, [:public, :named_table])
  end
end

相关问题