- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了Kernel.apply/3
它允许通过将方法指定为原子来动态调用模块中的公共(public)方法,例如result = apply(__MODULE__, :my_method, [arg])
转换为 result = my_method(arg)
让我感到困惑的是调用私有(private)方法的方式;给定这样的代码:
defmodule MyModule do
def do_priv(atom, args) when is_list(args) do
apply(__MODULE__, atom, args)
end
# (change defp => def, and this all works)
defp something_private(arg), do: arg #or whatever
end
MyModule.do_priv(:something_private, [1])
是允许的,因为它是从模块内调用私有(private)方法。我可以理解 Elixir 在底层使用 Erlang 的 apply/3,所以这种方法可能不会让我们到达那里。
Code.eval_quoted/3
方法,但它似乎甚至不能调用硬编码的私有(private)方法(因此没有时间花在手动构建 AST 上,而不是使用
quote do
如下 - 尽管如果有人看到如何制作这个选项,这是一个选项工作):
defmodule MyModule do
def do_priv_static do
something_private(1) #this works just fine
end
def do_priv_dynamic do
code = quote do
something_private(1)
end
Code.eval_quoted(code, [], __ENV__) #nope. fails
end
defp something_private(arg), do: arg #or whatever
end
__ENV__
eval_quoted
的参数
defp
至
def
,这是我个人代码的一个很好的解决方案;但由于我编写的代码支持其他关心的程序员,我想找到一个解决方案。
最佳答案
一开始你应该知道f()
在 MyModule 模块中调用与 MyModule.f()
不同。在同一个地方调用。见 http://www.erlang.org/doc/reference_manual/code_loading.html#id86422
您只能调用私有(private)函数 f()
风格。编译器也会检查这些调用 - 如果函数不存在,则会出现编译错误。当您使用 MyModule.f()
在同一个地方,您不会收到编译错误,因为这些调用仅在运行时检查(即使您从自身内部调用模块)并且效果(AFAIK)与调用 MyModule.f()
相同从任何其他模块 - 在运行时查找该模块,您只能调用导出的(公共(public))函数。
因此,除了简单的 f()
之外,您不能以任何其他方式调用私有(private)函数。 . apply(mod,fun,[])
相当于mod.fun.()
style - 模块在运行时解析,私有(private)函数不可访问。
在此示例中,您可以自己尝试所有变体:https://gist.github.com/mprymek/3302ff9d13fb014b921b
您现在可以看到,在编译时必须始终知道对私有(private)函数的调用,因此您甚至不能使用 eval_quoted 魔术或任何其他魔术来使它们“动态”...
Sasa Juric 的使用建议 @doc false
是正确的解决方案。
关于Elixir - 动态调用私有(private)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28929866/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!