我相信答案是在使用元组时使用双括号(请参阅http://www.erlang.org/doc/apps/erts/match_spec.html#id69408的变量和文字部分)。因此,要在 matchspec 表达式中使用元组,请用大括号将该元组括起来,如下所示,
{'==','$2',{{1,2}}}
所以,如果我正确理解你的例子,你会有
22> M=[{{'_','$1','$2'},[{'==','$2',{{1,2}}}],['$_']}].
[{{'_','$1','$2'},[{'==','$2',{{1,2}}}],['$_']}]
23> ets:match_spec_run([{1,1,{1,2}}],ets:match_spec_compile(M)).
[{1,1,{1,2}}]
24> ets:match_spec_run([{1,1,{2,2}}],ets:match_spec_compile(M)).
[]
编辑:(很抱歉编辑您的答案,但这是以可读形式获得我的评论的最简单方法)是的,必须这样做。获取匹配规范的一种更简单的方法是使用(伪)函数ets:fun2ms/1
,该函数将文字fun 作为参数并返回匹配规范。所以
10> ets:fun2ms(fun ({A,B,C}=X) when C == {1,2} -> X end).
[{{'$1','$2','$3'},[{'==','$3',{{1,2}}}],['$_']}]
外壳识别ets:fun2ms/1
. 有关详细信息,请参阅ETS 文档。Mnesia 使用与 ETS 相同的匹配规范。