2012-02-07 25 views
1

無視:特定のフィールドを持つレコードのリストで検索し、私は記録として定義されている残り

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

は、私は3つのレコードを作成し、

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}] 

今リストに入れを、どのように

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

をすることができます私は、リスト「」は1であるレコードが含まれているかどうかを確認したいと私は残りのフィールドのために気にしません私はそれを達成する?

答えて

3

レコードは純粋な構文糖です。レコード宣言の他のフィールドの値を指定しないと、 'undefined'というアトムが使用されます。したがって、あなたの検索は:

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

...もちろん存在しません。

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

私はリストを行うことができなかった複数のフィールドに比較することができますので、これは偉大なりますkeyfind/2。リストもあります:リストの理解ができない一致が見つかった場合、any/2はルックを破ります。 –

7

をそれとも、keyfind使用できます。

代わりにこれを試してみてください。

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

またはリスト内包表記:

OneList = [E || E <- L, E#fact.a =:= 1] 
関連する問題