我相信答案是在使用元組時使用雙括號(請參閱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
,其將文字樂趣作爲參數並返回匹配規格。所以
10> ets:fun2ms(fun ({A,B,C}=X) when C == {1,2} -> X end).
[{{'$1','$2','$3'},[{'==','$3',{{1,2}}}],['$_']}]
殼識別ets:fun2ms/1
。欲瞭解更多信息,請參閱ETS documentation。 Mnesia使用與ETS相同的匹配規格。
您的數據如何存儲在Mnesia?記錄是什麼樣的? – rvirding
問題解決了,謝謝。我現在可以使用像erlang:now()或calendar:local_time()這樣的值作爲記錄字段並對它們進行過濾。沒有仔細閱讀matchspecs文檔。 – user1945673