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 中的(本地)Mnesia 实例上实现最佳写入性能