【问题标题】:How to create complex queries with elixir ets如何使用 elixir ets 创建复杂的查询
【发布时间】:2019-06-11 19:55:00
【问题描述】:

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

如下图...

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

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

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

为了清楚起见,表格类似于下面的灵药清单...

iex()> postcode_list = [{"OX495NU","latlong"}, {"M320JG", "latlong"}]

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

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

【问题讨论】:

    标签: caching erlang elixir ets


    【解决方案1】:

    不能在匹配中调用任意函数,但这里有一个可以与:ets.foldl/3 一起使用的匹配:

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

    【讨论】:

    • 感谢您的回复。我正在尝试理解您的答案,但无法使其与我的示例一起使用,如果我误解了某些内容,我深表歉意。看起来您正在使用&lt;&lt;"0X49", _ :: binary&gt;&gt; 折叠邮政编码字符串上的 ets 列表和模式匹配,然后创建一个包含与邮政编码模式匹配的所有案例的新列表。这是正确的吗?
    • 是的,确实如此。 :ets.fun2ms 不接受具有不确定字节长度的二进制匹配,这就是原因。
    • 很高兴知道谢谢(我对所有这些东西都很陌生)。我想我对现在发生的事情有一个很好的理解,但我仍然遇到错误。我认为你答案的第三行应该是acc -&gt; acc,而不是_ -&gt; acc。这给了我一个:ets.safe_fixtable 错误。你的回答有什么我误解的地方吗?
    • 该死的,当然,感谢您的敏锐眼睛,修复。现在应该是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2023-03-25
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多