2012-02-07 19 views
1

我有一個記錄定義爲:搜索在特定領域的記錄列表,並忽略其它

1> rd(fact, {a,b,c}). 
fact 

我創建三個記錄,並把它們放在一個列表

2> F1 = #fact{a=1,b=1,c=1}. 
#fact{a = 1,b = 1,c = 1} 
(3> F2 = #fact{a=2,b=2,c=2}. 
#fact{a = 2,b = 2,c = 2} 
3> F3 = #fact{a=3,b=3,c=3}. 
#fact{a = 3,b = 3,c = 3} 
4> L = [F1,F2,F3]. 
[#fact{a = 1,b = 1,c = 1}, 
#fact{a = 2,b = 2,c = 2}, 
#fact{a = 3,b = 3,c = 3}] 

現在,我想檢查列表是否包含「a」爲1的記錄,而我不在乎其餘的字段

([email protected])21> lists:member(#fact{a=1}, L). 
false 
([email protected])23> lists:member(#fact{a=1,b=1,c=1}, L). 
true 

怎麼能我完成了嗎?

回答

3

記錄是純粹的語法糖。如果您沒有在記錄聲明中指定其他字段的值,則使用原子'undefined'。因此,你的搜索是:

#fact{a=1, b='undefined', c='undefined'} 

......這當然不存在。

試試這個:

lists:any(fun(#fact{a=A}) -> A =:= 1 end, L). 
+0

這看起來太棒了,因爲我可以在一個以上的字段,我無法列出做比較:keyfind/2。還列出:當找到匹配列表理解不會執行的匹配時,任何/ 2都將打破外觀。 – 2012-02-07 12:46:56

7

或者你可以使用keyfind。

lists:keyfind(1, #fact.a, L). 
3

或列表理解:

OneList = [E || E <- L, E#fact.a =:= 1]