使用Kernel.apply调用私有方法

时间:2018-03-28 23:10:56

标签: elixir

我正在尝试动态调用模块中的私有方法。

Kernel.apply能够调用公共方法,但是在尝试调用私有方法时遇到了未定义的错误,即使是在我的模块的上下文中也是如此。有没有办法让方法私有但仍然动态调用?

实施例

defmodule Test do
  def hello() do
    IO.puts("hello")
    Kernel.apply(Test, :world, []) # This works
    Kernel.apply(Test, :worldp, []) # But this doesn't
  end

  def world() do
    IO.puts("world")
  end

  defp worldp() do
    IO.puts("worldp")
  end
end

结果

iex(2)> Test.hello
hello
world
** (UndefinedFunctionError) function Test.worldp/0 is undefined or private. Did you mean one of:

      * world/0

1 个答案:

答案 0 :(得分:1)

Kernel.apply(Test, :worldp, [])就像Test.worldp()

您不能在模块外调用私有函数。

你可以试试这个:

defmodule Test do
  def hello() do
    IO.puts("hello")
    Kernel.apply(&worldp/0, [])
  end

  defp worldp() do
    IO.puts("worldp")
  end

end
Test.hello()