2011-02-06 5 views

ответ

30

Эрланга 19.0+

использовать макрос ?FUNCTION_NAME, чтобы получить имя текущей функции в качестве атома, и ?FUNCTION_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 арностью (число аргументов), а не фактические аргументы. Первый аргумент process_info/2 - это идентификатор процесса, который может быть либо текущим процессом (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

+0

@ Stratus3D Спасибо! Я обновил ответ –

5

во время выполнения вы можете выбросить исключение и проверить верхнюю часть stacktrace.

foo() -> 
    catch throw(away), 
    [{Module, Fun, Arity} | _] = erlang:get_stacktrace(), 
    io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]). 
Смежные вопросы