1

次のコードは、警告付きでコンパイルされます。

23> c(passing_records).                                              
passing_records.erl:8: Warning: wrong number of arguments in format call
{ok,passing_records}

しかし、それを実行しようとすると、次の名前のレコードに変数を渡そうとすると、このエラーが発生しますpass

22> passing_records:record_passing([#pass{arg1=2,name="x",to_go=5}]).
* 1: record pass undefined

コードは次のとおりです。

-module(passing_records).
-export([record_passing/1]).
-record(pass, {arg1 ,
                name="",
                to_go=0}).  

record_passing( #pass{arg1 = ARG1, name = NAME, to_go = TO_GO}) ->
        io:format("~p ~p~n", [ARG1,NAME,TO_GO]).    
4

2 に答える 2

5

エラーの理由は、レコードを直接使用できるようにするにrecord pass undefinedは、コマンドを使用してシェルにレコードをロードする必要があるためです。rr詳細については、この質問を参照してください。

そうすると、コンパイラが警告している問題が発生します。

Eshell V5.9  (abort with ^G)
1> c("/tmp/passing_records", [{outdir, "/tmp/"}]).
c("/tmp/passing_records", [{outdir, "/tmp/"}]).
/tmp/passing_records.erl:8: Warning: wrong number of arguments in format call
{ok,passing_records}
2> rr(passing_records).
[pass]
3> passing_records:record_passing([#pass{arg1=2,name="x",to_go=5}]).
** exception error: no function clause matching 
                    passing_records:record_passing([#pass{
                                                     arg1 = 2,name = "x",
                                                     to_go = 5}]) (/tmp/passing_records.erl, line 7)
4> passing_records:record_passing(#pass{arg1=2,name="x",to_go=5}).
** exception error: bad argument
     in function  io:format/3
        called as io:format(<0.24.0>,"~p ~p~n",[2,"x",5])

(関数はレコードのみを期待しているのに対し、リスト内のレコードも渡しているため、3行目のエラーです。)

于 2013-03-07T13:19:01.817 に答える
1

警告メッセージにあるように、問題は8行目にあります。

 io:format("~p ~p~n", [ARG1,NAME,TO_GO])

フォーマット文字列に3つの引数のリスト(ARG1、NAME、TO_GO)を渡しますが、フォーマット文字列はそのうちの2つのみを使用します(〜pは2つだけです)。それは記録とは何の関係もありません。

于 2013-03-07T13:11:26.250 に答える