0

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)

エラーの理由は何ですか?

4

1 に答える 1

6

コードに複数の問題があります

1. フィルターは、すべてのリスト要素に対して常にアトム true または false を返す必要があります。これがエラーの原因です。

2.funヘッダでfunブロック外の変数を使用した場合、パターンマッチされず、外の変数がマスクされる。したがって、パターン マッチは失敗します。

以下の変更されたコードを確認できます。

  lookup(AccountNumber, DBRef)  ->
    lists:filter(
      fun(#account{no=AccNo}) when AccNo =:= AccountNumber -> true;
         (_) -> false 
      end, DBRef).
于 2013-02-25T19:40:15.873 に答える