Elixir / Erlang中的命名函数是否等效于__MODULE__?

时间:2017-11-14 08:39:33

标签: erlang elixir

是否有类似于检索函数的名称,就像__MODULE__检索Elixir / Erlang中的模块名一样?

示例:

defmodule Demo do
  def home_menu do
    module_name = __MODULE__
    func_name = :home_menu 
    # is there a __FUNCTION__
  end
End

EDITED

所选答案有效,

但是使用apply / 3调用返回的函数名会产生此错误:

[error] %UndefinedFunctionError{arity: 4, exports: nil, function: :public_home, module: Demo, reason: nil}

我有一个功能:

defp public_home(u, m, msg, reset) do

end

有问题的功能将严格在其模块中调用。

有没有办法在自己的模块中按名称动态调用私有函数?

2 个答案:

答案 0 :(得分:10)

▶ defmodule M, do: def m, do: __ENV__.function  
▶ M.m                                                 
#⇒ {:m, 0}

基本上,__ENV__结构包含您可能需要的所有内容。

答案 1 :(得分:2)

是的,有。在Erlang中,several predefined macros应该能够提供您需要的信息:

% The name of the current function
?FUNCTION_NAME

% The arity of the current function (remember name alone isn't enough to identify a function in Erlang/Elixir)
?FUNCTION_ARITY 

% The file name of the current module
?FILE 

% The line number of the current line
?LINE 

来源:http://erlang.org/doc/reference_manual/macros.html#id85926