Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir ETS密钥模式匹配_Elixir_Ets - Fatal编程技术网

Elixir ETS密钥模式匹配

Elixir ETS密钥模式匹配,elixir,ets,Elixir,Ets,我正在使用ETS缓存一个数据库模式,该模式来自使用ecto的后出口 以下是这些例子: 表=:ets.new(:cache_name,[:set,:protected]) 并包括: :ets.insert(表,{:first_表,{1}) :ets.insert(表,{:first_表,{5}) :ets.insert(表,{:second_表,{1}) 但是第二个替换了第一个,因为这个原因,我对表名和id进行了加密,以获得一个唯一的键:ets.insert(表,{:first_table1,{1

我正在使用ETS缓存一个数据库模式,该模式来自使用ecto的后出口 以下是这些例子:

表=:ets.new(:cache_name,[:set,:protected])

并包括:

:ets.insert(表,{:first_表,{1})

:ets.insert(表,{:first_表,{5})

:ets.insert(表,{:second_表,{1})

但是第二个替换了第一个,因为这个原因,我对表名和id进行了加密,以获得一个唯一的键
:ets.insert(表,{:first_table1,{1}})
,用于这些注册表,但在我想要为第一个表创建第一个注册表的时候,我遇到了一个问题,因为我为第二个表包含了相同的键,它检索了两个注册表:

:ets.match_对象(表,{:“{,{1}”)


我如何向ETS指定,如果键包含表名,请检索这些注册表?

我认为您无法将atom名称的一部分与
:ETS.match\u object
匹配。如果希望同时基于table和id以及仅基于table进行查找,我建议使用table name和id的元组作为键:

table = :ets.new(:cache_name, [:set, :protected])

:ets.insert(table, {{:first_table, 1}, {1}})
:ets.insert(table, {{:first_table, 2}, {5}})
:ets.insert(table, {{:second_table, 1}, {1}})

# Get table = :first_table, id = 1
IO.inspect :ets.lookup(table, {:first_table, 1})
# Get table = :first_table and any id
IO.inspect :ets.match_object(table, {{:first_table, :_}, :_})
输出:

[{{:first_table, 1}, {1}}]
[{{:first_table, 1}, {1}}, {{:first_table, 2}, {5}}]