関数自体の名前を知ることはできますか?関数の名前を取得するには?
main()->
myFunction().
myFunction()->
io:write("I am ~s !",[????]).
関数自体の名前を知ることはできますか?関数の名前を取得するには?
main()->
myFunction().
myFunction()->
io:write("I am ~s !",[????]).
アーラン19.0+
整数としてアリティを取得する原子として現在の関数の名前、および?FUNCTION_ARITY
を取得するマクロ?FUNCTION_NAME
を使用。
例:
main()->
myFunction().
myFunction()->
io:write("I am ~p !",[?FUNCTION_NAME]).
これはEEP-0045で実施されました。古いErlangのバージョンでは
古いErlangのバージョン
、コンパイル時に現在の関数名を取得する簡単な方法はありません。ただし、実行時にそれを取得することができます。
A
はアリティ(引数の数)ではなく、実引数である
{current_function, {M, F, A}} = process_info(self(), current_function)
。 process_info/2
の最初の引数は、現在のプロセス(self()
)または他のプロセスのいずれかになるプロセスIDです。たとえば:
1> process_info(self(), current_function).
{current_function,{erl_eval,do_apply,5}}
注しかし、これは?FUNCTION_NAME
マクロと機能的に同等になりながら、それははるかに遅いということは、実行時に評価されるため。
実行時に、例外をスローしてスタックトレースの先頭を確認することができます。
foo() ->
catch throw(away),
[{Module, Fun, Arity} | _] = erlang:get_stacktrace(),
io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]).
'?FUNCTION_NAME'と'?FUNCTION_ARITY'マクロが存在します:http://erlang.org/doc/reference_manual/macros.html#id85926 – Stratus3D
@ Stratus3Dありがとうございました!私は答えを更新しました –