如何获取函数的名称?

Ber*_*aud 18 erlang

是否有可能知道函数的名称?

main()->    
  myFunction().

myFunction()->
  io:write("I am ~s !",[????]).
Run Code Online (Sandbox Code Playgroud)

Ada*_*erg 31

Erlang 19.0+

使用宏?FUNCTION_NAME将当前函数的名称作为原子?FUNCTION_ARITY获取,并将arity作为整数.

例:

main()->    
  myFunction().

myFunction()->
  io:write("I am ~p !",[?FUNCTION_NAME]).
Run Code Online (Sandbox Code Playgroud)

这是在EEP-0045中实现的.

较旧的Erlang版本

在较旧的Erlang版本中,没有简单的方法可以在编译时获取当前的函数名称.但是,您可以在运行时检索它:

{current_function, {M, F, A}} = process_info(self(), current_function)
Run Code Online (Sandbox Code Playgroud)

Aarity(参数的数量)在哪里,而不是实际的参数.第一个参数process_info/2是进程ID,它可以是当前进程(self())或其他进程.例如:

1> process_info(self(), current_function).
{current_function,{erl_eval,do_apply,5}}
Run Code Online (Sandbox Code Playgroud)

但请注意,虽然这在功能上等同于?FUNCTION_NAME宏,但速度要慢得多,因为它在运行时进行了评估.

  • `?FUNCTION_NAME` 和 `?FUNCTION_ARITY` 宏现在存在:http://erlang.org/doc/reference_manual/macros.html#id85926 (2认同)

小智 5

在运行时,您可以抛出异常并检查堆栈跟踪的顶部.

foo() ->
    catch throw(away),
    [{Module, Fun, Arity} | _] = erlang:get_stacktrace(),
    io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]).
Run Code Online (Sandbox Code Playgroud)