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

Posted

技术标签:

【中文标题】在不使用保护子句的情况下过滤 erlang ets 表【英文标题】:Filtering erlang ets tables without using guard clauses 【发布时间】:2019-06-10 13:27:50 【问题描述】:

在 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

这样的事情可能吗?

【问题讨论】:

你也可以使用 ets:foldl。 【参考方案1】:

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

来自erlangdocumentation

乐趣很有限,它只能接受一个参数(要匹配的对象):一个单一的变量或一个元组。它必须使用 is_ 保护测试。不允许在匹配规范中没有表示的语言构造(if、case、receive 等)。

更多关于Match Specifications in Erlang的信息

【讨论】:

以上是关于在不使用保护子句的情况下过滤 erlang ets 表的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在不破坏嵌套的情况下过滤 RECORD 中的列?

如何在不使用 Group By / 有函数的情况下过滤 SQL 中的数据

在不更改数据源的情况下过滤 DataGridView

在 WPF 中,您可以在没有代码的情况下过滤 CollectionViewSource 吗?

在没有 DOM 的情况下过滤内存中的 XML 节点?

如何在没有 Shiny 的情况下过滤 Rmarkdown 中的预聚合数据?