在灵药中,我希望能够使用函数过滤 ets 表。
我目前在 iex 外壳中有一个简单的 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
文档
乐趣非常有限,它只能采用单个参数(要匹配的对象):唯一变量或元组。它必须使用is_防护测试。不允许使用在匹配规范中没有表示形式的语言构造(if、case、receive等)。
有关 Erlang 中的匹配规范的更多信息