在不使用保护子句的情况下过滤 erlang ets 表
Filtering erlang ets tables without using guard clauses
在 elixir 中,我希望能够使用函数过滤 ets table。
我目前在 iex shell...
中有一个简单的 ets table 示例
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)
[{{:""}, [{:<, :"", 4}], [:""]}]
:ets.select(:nums, fun)
[1, 3, 2]
一切如您所愿。我的问题与用于查询 ets table 的函数有关。目前它使用保护子句来过滤小于 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
The fun is very restricted, it can take only a single parameter (the object to match): a sole variable or a tuple. It must use the is_ guard tests. Language constructs that have no representation in a match specification (if, case, receive, and so on) are not allowed.
的更多信息
在 elixir 中,我希望能够使用函数过滤 ets table。
我目前在 iex shell...
中有一个简单的 ets table 示例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)
[{{:""}, [{:<, :"", 4}], [:""]}]
:ets.select(:nums, fun)
[1, 3, 2]
一切如您所愿。我的问题与用于查询 ets table 的函数有关。目前它使用保护子句来过滤小于 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
的更多信息The fun is very restricted, it can take only a single parameter (the object to match): a sole variable or a tuple. It must use the is_ guard tests. Language constructs that have no representation in a match specification (if, case, receive, and so on) are not allowed.