2011-02-06 103 views

回答

30

二郎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

5

在運行時,您可以引發異常並檢查堆棧跟蹤的頂部。

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