Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?

Posted

技术标签:

【中文标题】Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?【英文标题】:Is there an equivalent to __MODULE__ for named functions in Elixir/ Erlang?Elixir/Erlang 中的命名函数是否有等效于 __MODULE__ 的方法? 【发布时间】:2018-04-27 03:01:14 【问题描述】:

是否有类似__MODULE__ 在 Elixir/Erlang 中检索模块名称的方法来检索函数名称?

例子:

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

已编辑

所选答案有效,

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

[error] %UndefinedFunctionErrorarity: 4, exports: nil, function: :public_home, module: Demo, reason: nil

我有一个功能:

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

end

相关函数将严格在其模块内调用。

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

【问题讨论】:

Predefined Macros @OnorioCatenacci 我明白你的意思。有问题的函数将严格在其模块内调用。有没有办法在自己的模块中按名称动态调用私有函数? 您是否在递归地尝试从其内部调用该函数?在这种特殊情况下,虽然我可以看到不必指定函数名称的吸引力,但我想说你应该硬着头皮把它硬编码在函数体中。 @OnorioCatenacci 没有。我存储用户执行的先前和当前功能。我需要能够使用它来回退和前进。每种方法都相当于一个菜单/页面。我正在尝试使用 apply 来调用 user.current 或 user.previous 函数 那么 Code.eval_string 呢? hexdocs.pm/elixir/Code.html#eval_string/3 这能满足你的需要吗? 【参考方案1】:
▶ defmodule M, do: def m, do: __ENV__.function  
▶ M.m                                                 
#⇒ :m, 0

基本上,__ENV__ 结构包含您可能需要的一切。

【讨论】:

我对此有点困惑,我能够获取函数名称,但使用 apply/3 调用它失败:[error] %UndefinedFunctionErrorarity: 4, exports: nil, function: :public_home, module: Demo, reason: nil 公开吗?您是否进行了模式匹配并仅传递了名称? 无法从外部访问私有函数。【参考方案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

【讨论】:

@你知道每种灵药的等效物吗? 不,但看起来@mudasobwa 的答案在 Elixir 中有效。 __ENV__.function 相当于 ?FUNCTION_NAME, ?FUNCTION_ARITY。这是 Elixir 和 Erlang 有很大不同的一个领域,因此很难找到在它们之间工作完全相同的东西。 不,不是:groups.google.com/d/msg/elixir-lang-talk/VbGTz7rKebM/…

以上是关于Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Elixir/Erlang

在 Elixir/Erlang 中的(本地)Mnesia 实例上实现最佳写入性能

Elixir/Erlang 并发状态访问

E1.获取Elixir/Erlang版本信息

Elixir/Erlang:变量列表与许多其他列表合并时出错

将本地 Elixir/Erlang 连接到 Docker 容器内正在运行的应用程序