Czy możliwe jest poznanie nazwy samej funkcji?Jak uzyskać nazwę funkcji?
Odpowiedz
Erlang 19.0+
obsługi makro ?FUNCTION_NAME
uzyskać nazwę aktualnej funkcji, jak atom lub ?FUNCTION_ARITY
uzyskać Arity jako liczbę całkowitą.
przykład:
main()->
myFunction().
myFunction()->
io:write("I am ~p !",[?FUNCTION_NAME]).
ten został zrealizowany w EEP-0045.
Starsze Erlang Wersje
W starszych wersjach Erlang, nie ma prosty sposób, aby uzyskać aktualną nazwę funkcji w czasie kompilacji. Można jednak odzyskać go w czasie wykonywania:
{current_function, {M, F, A}} = process_info(self(), current_function)
Gdzie A
jest arity (liczba argumentów), a nie rzeczywiste argumenty. Pierwszy argument do process_info/2
to identyfikator procesu, który może być bieżącym procesem (self()
) lub innym procesem. Na przykład:
1> process_info(self(), current_function).
{current_function,{erl_eval,do_apply,5}}
Uwaga jednak, że o ile byłoby to równoważne funkcjonalnie ?FUNCTION_NAME
makro, to o wiele wolniej, ponieważ jest oceniana w czasie pracy.
w środowisku wykonawczym można rzucić wyjątek i sprawdzić szczyt stosu.
foo() ->
catch throw(away),
[{Module, Fun, Arity} | _] = erlang:get_stacktrace(),
io:format("I am ~p:~p/~p!~n",[Module, Fun, Arity]).
Teraz dostępne są makra '? FUNCTION_NAME' i'? FUNCTION_ARITY': http://erlang.org/doc/reference_manual/macros.html#id85926 – Stratus3D
@ Stratus3D Dzięki! Zaktualizowałem odpowiedź –