在 elixir 中,我希望能够使用函数过滤 ets 表。

我目前在 iex shell 中有一个简单的 ets 表示例...

iex> :ets.new(:nums, [:named_table])
:nums

iex> :ets.insert :nums, [{1}, {2}, {3}, {4}, {5}]
true

fun = :ets.fun2ms(fn {n} when n < 4 -> n end)
[{{:"$1"}, [{:<, :"$1", 4}], [:"$1"]}]
:ets.select(:nums, fun)
[1, 3, 2]

这一切都如您所愿。我的问题与用于查询 ets 表的函数有关。目前它使用一个保护子句来过滤小于 4 的结果。

我想知道是否有办法将保护子句语法放入函数体中。例如...
iex> fun2 = :ets.fun2ms(fn {n} -> if n < 4, do: n end)

但如果我这样做,我会收到以下错误...
Error: the language element case (in body) cannot be translated into match_spec
{:error, :transform_error}

这样的事情可能吗?

最佳答案

事实证明,这是唯一的出路

来自 erlang documentation



有关 Match Specifications in Erlang 的更多信息

关于caching - 在不使用保护子句的情况下过滤 erlang ets 表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54217424/

10-12 04:14