如何比较erlang中记录列表中的成员

时间:2013-12-16 14:54:58

标签: erlang

Sched_entsl1_dl_se类型的记录列表,其中dci作为其元素/字段名称之一,它本身是不同类型的记录,其中一种类型是l1_format0。我正在尝试查看列表dci中的任何记录中是否存在l1_format0类型的Sched_ents条记录。如果列表中的任何记录中都有此类成员,则返回x=1,否则x=2

我尝试使用list:keymember as:

case lists:keymember(l1_format0,#l1_dl_se.dci,Sched_ents) of
                         true  -> X=1;
                         false -> X=2
end

2 个答案:

答案 0 :(得分:1)

根据评论,我认为你正在寻找这样的东西:

case [ X || X <- Sched_ents,
      is_record(X, l1_dl_se),
      is_record(X#l1_dl_se.dci, l1_format0)] of
    [] -> 2; %% none found
    _List -> 1 %% One or more found
end

列表理解为您提供的列表仅包含Sched_ents#l1_dl_se条记录中包含#l1_format0记录的元素。

答案 1 :(得分:0)

您应该使用进行短路评估的lists:any/2

F = fun(#l1_dl_se{dci = #l1_format0{}}) -> true; (_) -> false end,
case lists:any(F, Sched_ents) of
    true  -> X = 1;
    false -> X = 1
end

使用erlang:is_record/2也可以正常使用

F = fun(X) -> is_record(X, l1_dl_se) andalso is_record(X#l1_dl_se.dci, l1_format0) end,