是否可以知道函数的名称?
main()->
myFunction().
myFunction()->
io:write("I am ~s !",[????]).
答案 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]).