0

我想erlang datetime将标准格式{{Y,M,D},{H,Min,Sec}}的值MNESIA table用于记录目的,并且能够通过与恒定的开始和结束时间元组进行比较来选择日志条目。

似乎 matchspec 保护编译器以某种方式将元组值与保护子表达式混淆了。评估ets:match_spec_compile(MatchSpec)失败

MatchSpec = [
{
{'_','$1','$2'}
,
[
{'==','$2',{1,2}}
]
,
['$_']
}
]

但是当我$2与任何非元组值进行比较时成功。

是否存在匹配守卫不能比较元组值的限制?

4

1 回答 1

2

我相信答案是在使用元组时使用双括号(请参阅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 相同的匹配规范。

于 2013-01-03T19:12:22.623 回答