Возможно ли узнать имя функции в себе?Как получить имя функции?
main()->
myFunction().
myFunction()->
io:write("I am ~s !",[????]).
Возможно ли узнать имя функции в себе?Как получить имя функции?
main()->
myFunction().
myFunction()->
io:write("I am ~s !",[????]).
Эрланга 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
макрокоманды, это гораздо медленнее, потому что оно вычисляется во время выполнения.
во время выполнения вы можете выбросить исключение и проверить верхнюю часть stacktrace.
foo() ->
catch throw(away),
[{Module, Fun, Arity} | _] = erlang:get_stacktrace(),
io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]).
Теперь существуют макросы '? FUNCTION_NAME' и'? FUNCTION_ARITY': http://erlang.org/doc/reference_manual/macros.html#id85926 – Stratus3D
@ Stratus3D Спасибо! Я обновил ответ –