是否有可能知道函数的名称?
main()->
myFunction().
myFunction()->
io:write("I am ~s !",[????]).
Run Code Online (Sandbox Code Playgroud)
Ada*_*erg 31
Erlang 19.0+
使用宏?FUNCTION_NAME将当前函数的名称作为原子?FUNCTION_ARITY获取,并将arity作为整数.
例:
main()->
myFunction().
myFunction()->
io:write("I am ~p !",[?FUNCTION_NAME]).
Run Code Online (Sandbox Code Playgroud)
这是在EEP-0045中实现的.
较旧的Erlang版本
在较旧的Erlang版本中,没有简单的方法可以在编译时获取当前的函数名称.但是,您可以在运行时检索它:
{current_function, {M, F, A}} = process_info(self(), current_function)
Run Code Online (Sandbox Code Playgroud)
Aarity(参数的数量)在哪里,而不是实际的参数.第一个参数process_info/2是进程ID,它可以是当前进程(self())或其他进程.例如:
1> process_info(self(), current_function).
{current_function,{erl_eval,do_apply,5}}
Run Code Online (Sandbox Code Playgroud)
但请注意,虽然这在功能上等同于?FUNCTION_NAME宏,但速度要慢得多,因为它在运行时进行了评估.
小智 5
在运行时,您可以抛出异常并检查堆栈跟踪的顶部.
foo() ->
catch throw(away),
[{Module, Fun, Arity} | _] = erlang:get_stacktrace(),
io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]).
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2651 次 |
| 最近记录: |