如何获取函数的名称?

问题描述:

是否有可能知道函数本身的名称?如何获取函数的名称?

main()->  
    myFunction(). 

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

二郎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宏,它更慢,因为它在运行系统中进行评估。

+1

`?FUNCTION_NAME`和`?FUNCTION_ARITY`宏现在存在:http://erlang.org/doc/reference_manual/macros.html#id85926 – Stratus3D 2017-11-14 14:25:03

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

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