erlang 如何获取函数的名称?

b91juud3  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(213)

有可能知道函数本身的名字吗?

a_function()->
    io:format("I am ~p!", [????]). % What to use here?
e4eetjau

e4eetjau1#

使用宏?FUNCTION_NAME以原子形式获取当前函数的名称,使用宏?FUNCTION_ARITY以整数形式获取arity。
示例:
第一个
这是在EEP-0045中实现的。

对于Erlang版本18及更早版本

在旧的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宏,但它要慢得多,因为它是在运行时计算的。

fdbelqdn

fdbelqdn2#

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

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

相关问题