如何获取函数的名称?

时间:2011-02-06 18:48:54

标签: erlang

是否可以知道函数的名称?

main()->    
  myFunction().

myFunction()->
  io:write("I am ~s !",[????]).

2 个答案:

答案 0 :(得分:31)

Erlang 19.0 +

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

示例:

main()->    
  myFunction().

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

这已在EEP-0045中实施。

较旧的Erlang版本

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

{current_function, {M, F, A}} = process_info(self(), current_function)

其中A是arity(参数个数),而不是实际参数。 process_info/2的第一个参数是进程ID,可以是当前进程(self())或其他进程。例如:

1> process_info(self(), current_function).
{current_function,{erl_eval,do_apply,5}}

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

答案 1 :(得分:5)

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

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