当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang select(Table, MatchSpec)用法及代码示例


select(Table, MatchSpec) -> [Match]
类型:
Table = table()
MatchSpec = match_spec()
Match = term()

匹配表中的对象Table用一个匹配规格。这是一个比match/2match_object/2调用。最简单的匹配规范如下:

MatchSpec = [MatchFunction]
MatchFunction = {MatchHead, [Guard], [Result]}
MatchHead = "Pattern as in ets:match"
Guard = {"Guardtest name", ...}
Result = "Term construct"

这意味着匹配规范始终是一个或多个元组(元数为 3)的列表。元组的第一个元素是一个模式,如中所述match/2。元组的第二个元素是 0 个或多个防护测试的列表(如下所述)。元组的第三个元素是一个列表,其中包含要返回的值的说明。在几乎所有正常情况下,该列表只包含一个术语,它完整地说明了每个对象返回的值。

返回值是使用MatchHead中绑定的"match variables"或使用特殊匹配变量'$_'(整个匹配对象)和'$$'(列表中的所有匹配变量)构造的,因此以下match/2表达:

ets:match(Table,{'$1','$2','$3'})

完全等同于:

ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

以下match_object/2 调用:

ets:match_object(Table,{'$1','$2','$1'})

完全等于

ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

Result 部分中可以通过简单地编写一个列表来构造复合项,如下代码:

ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])

给出与以下相同的输出:

ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])

即,将匹配头中的所有绑定变量作为列表。如果要构造元组,则必须编写元数为 1 的元组,其中元组中的单个元素是要构造的元组(因为普通元组可能会被误认为 Guard )。

因此以下调用:

ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])

给出与以下相同的输出:

ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])

此语法等效于跟踪模式中使用的语法(请参阅 dbg(3))Runtime_Tools 中的模块。

Guard 被构造为元组,其中第一个元素是测试名称,其余元素是测试参数。要检查绑定到匹配变量 '$1' 的元素的特定类型(例如列表),可以将测试编写为 {is_list, '$1'} 。如果测试失败,则表中的对象不匹配,并尝试下一个MatchFunction(如果有)。 Erlang 中存在的大多数防护测试都可以使用,但只允许前缀为 is_ 的新版本( is_floatis_atom 等)。

Guard 部分还可以包含逻辑和算术运算,它们的编写语法与防护测试(前缀表示法)相同,因此用 Erlang 编写的防护测试如下:

is_integer(X), is_integer(Y), X + Y < 4711

表达如下(X替换为'$1'Y替换为'$2'):

[{is_integer, '$1'}, {is_integer, '$2'}, {'<', {'+', '$1', '$2'}, 4711}]

对于 ordered_set 类型的表,对象的访问顺序与 first /next 遍历中的顺序相同。这意味着匹配规范针对具有 first /next 顺序的键的对象执行,并且相应的结果列表按照该执行的顺序。

相关用法


注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 select(Table, MatchSpec) -> [Match]。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。