如何使用 Elixir ets 创建复杂查询

Rob*_*ion 5 erlang caching elixir ets

我使用 erlangs ets 功能缓存了一堆邮政编码和经纬度值。

如下图...

iex()> :ets.new(:postcode_cache, [:named_table])
:postcode_cache
iex()> :ets.insert(:postcode_cache, [{"OX495NU", "latlongvalue"},{"M320JG", "latlongvalue"}])
true
Run Code Online (Sandbox Code Playgroud)

这类似于我在应用程序中创建的 ets 表。我想创建一个函数,仅从缓存中选择条目,其中邮政编码包含用户输入的子字符串。有什么办法可以做到这一点,如果可以的话,我将如何实现这个功能?

(将来我可能只想使用经纬度值选择一定距离内的值,但这超出了这个问题的范围)。

为了清楚起见,该表类似于以下灵丹妙药列表......

iex()> postcode_list = [{"OX495NU","latlong"}, {"M320JG", "latlong"}]
Run Code Online (Sandbox Code Playgroud)

我想用 ets 复制的功能是这样的......

iex()> Enum.filter(list, fn({postcode, _}) -> if String.contains?(postcode, "OX49") end)
[{"OX495NU", "latlong"}]
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 4

人们不能在匹配中调用任意函数,但这里你手头有一个可以与以下命令一起使用的匹配:ets.foldl/3

:ets.foldl(fn
  {<<"0X49", _ :: binary>>, "latlong"} = n, acc -> [n | acc]
  _, acc -> acc
end, [], :named_table)
Run Code Online (Sandbox Code Playgroud)