select(Table, MatchSpec) -> [Match]
Table = table()
MatchSpec = match_spec()
Match = term()
匹配表中的对象Table
用一个匹配规格。这是一个比match/2
和match_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_float
、 is_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 select(Tab, Spec)用法及代码示例
- erlang select_replace(Table, MatchSpec)用法及代码示例
- erlang select_reverse(Continuation)用法及代码示例
- erlang self用法及代码示例
- erlang setelement(Index, Tuple1, Value)用法及代码示例
- erlang setopts(Socket, Options)用法及代码示例
- erlang setopts(Opts)用法及代码示例
- erlang send_request(Node, Module, Function, Args)用法及代码示例
- erlang set_token(Token)用法及代码示例
- erlang seq(From, To)用法及代码示例
- erlang seed(A1, A2, A3)用法及代码示例
- erlang sin用法及代码示例
- erlang str用法及代码示例
- erlang substr用法及代码示例
- erlang sort用法及代码示例
- erlang sublist用法及代码示例
- erlang sum用法及代码示例
- erlang split_binary用法及代码示例
- erlang spawn用法及代码示例
- erlang spawn on Node用法及代码示例
- erlang spawnlink用法及代码示例
- erlang safe_fixtable(Table, Fix)用法及代码示例
- erlang split(Filename)用法及代码示例
- erlang size(Item)用法及代码示例
注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 select(Table, MatchSpec) -> [Match]。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。