如何获取函数的名称?
答
二郎19.0+
使用宏?FUNCTION_NAME
来得到当前函数的名称作为一个原子,并?FUNCTION_ARITY
获得元数为整数。
实施例:
main()->
myFunction().
myFunction()->
io:write("I am ~p !",[?FUNCTION_NAME]).
这EEP-0045实施。
旧版本的二郎神
在旧版本的二郎神,有没有简单的方法来获得当前的函数名在编译时。但是,您可以在运行时检索:
{current_function, {M, F, A}} = process_info(self(), current_function)
哪里A
是元数(参数个数),而不是实际的参数。 process_info/2
的第一个参数是一个进程ID,它可以是当前进程(self()
)或其他进程。例如:
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 2017-11-14 14:25:03