有可能知道函数本身的名字吗?
a_function()-> io:format("I am ~p!", [????]). % What to use here?
e4eetjau1#
使用宏?FUNCTION_NAME以原子形式获取当前函数的名称,使用宏?FUNCTION_ARITY以整数形式获取arity。示例:第一个这是在EEP-0045中实现的。
?FUNCTION_NAME
?FUNCTION_ARITY
对于Erlang版本18及更早版本
在旧的Erlang版本中,没有一种简单的方法可以在编译时获取当前的函数名,但是你可以在运行时获取它:
{current_function, {M, F, A}} = process_info(self(), current_function)
其中A是arity(参数数目),而不是实际的参数。process_info/2的第一个参数是行程作业ID,可以是目前的行程作业(self())或其他行程作业。例如:
A
process_info/2
self()
1> process_info(self(), current_function). {current_function,{erl_eval,do_apply,5}}
但是请注意,虽然这在功能上等同于?FUNCTION_NAME宏,但它要慢得多,因为它是在运行时计算的。
fdbelqdn2#
在运行时,您可以抛出异常并检查堆栈跟踪的顶部。
foo() -> catch throw(away), [{Module, Fun, Arity} | _] = erlang:get_stacktrace(), io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]).
2条答案
按热度按时间e4eetjau1#
使用宏
?FUNCTION_NAME
以原子形式获取当前函数的名称,使用宏?FUNCTION_ARITY
以整数形式获取arity。示例:
第一个
这是在EEP-0045中实现的。
对于Erlang版本18及更早版本
在旧的Erlang版本中,没有一种简单的方法可以在编译时获取当前的函数名,但是你可以在运行时获取它:
其中
A
是arity(参数数目),而不是实际的参数。process_info/2
的第一个参数是行程作业ID,可以是目前的行程作业(self()
)或其他行程作业。例如:但是请注意,虽然这在功能上等同于
?FUNCTION_NAME
宏,但它要慢得多,因为它是在运行时计算的。fdbelqdn2#
在运行时,您可以抛出异常并检查堆栈跟踪的顶部。