在不使用保护子句的情况下过滤erlang ets表

时间:2019-01-16 12:48:53

标签: caching erlang elixir ets

在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}

这样可能吗?

1 个答案:

答案 0 :(得分:2)

事实证明,这是唯一的方法

来自erlang documentation

  

乐趣非常有限,它只能接受一个参数(要匹配的对象):一个单独的变量或一个元组。它必须使用is_ Guard测试。不允许在匹配规范中没有表示形式的语言结构(如果是大小写,接收等)。

有关Match Specifications in Erlang

的更多信息