我有以下代码从记录列表中返回一个记录,该记录的字段值等于Accountnumber。
lookup(AccountNumber, [#account{no=AccountNumber} = Rec | _]) ->
Rec;
lookup(AccountNumber, [_| T]) ->
lookup(AccountNumber, T);
lookup(AccountNumber, []) ->
not_found.
上面的代码工作正常,但是当我尝试使用以下代码将其转换为过滤器时:
lookup(AccountNumber, DBRef) ->
lists:filter(fun(#account{no=AccountNumber} = Rec) -> Rec end, DBRef).
我收到以下错误:
** exception error: no case clause matching #account{no = 2,balance = 0,pin = undefined,name = "Ali",
transactions = []}
in function lists:'-filter/2-lc$^0/1-0-'/2 (lists.erl, line 1271)
错误的原因是什么?
答案 0 :(得分:6)
代码中存在多个问题
1.过滤器应始终为所有列表元素返回true true或false。这会导致错误。
2.当乐趣块外部的变量用于有趣的标题时,它们没有图案匹配,外部变量被屏蔽。因此模式匹配失败。
您可以在下方看到修改后的代码。
lookup(AccountNumber, DBRef) ->
lists:filter(
fun(#account{no=AccNo}) when AccNo =:= AccountNumber -> true;
(_) -> false
end, DBRef).