Elixir Pry 不能执行私有方法?

Elixir Pry cannot execute private methods?

elixir 可以从模块内部撬 运行 私有方法吗?例如:

defmodule Test do
  require IEx

  def foo do
    IEx.pry
  end

  defp bar do
  end
end

此时对 bar 的调用不起作用。我是长生不老药的新手,我做错了什么或者这是不可能的原因吗?

这是预期的行为,因为 IEx.pry 允许您访问调用它的函数的局部变量,但不会将您置于被撬模块的范围内。

来自 IEx.pry 文档:

When a process is pried, all code runs inside IEx and, as such, it is evaluated and cannot access private functions of the module being pried. Module functions still need to be accessed via Mod.fun(args).

为了进一步说明,您可以查看__MODULE__的值。如果你从 IEx 运行 它计算为 nil(因为你不在 defmodule 块内):

iex(1)> __MODULE__
nil

如果您修改 foo 以检查当前模块,您不会有任何意外:

defmodule Test do
  require IEx

  def foo do
    IO.inspect __MODULE__
    IEx.pry
  end

  defp bar do
  end
end

现在我们在 iex 中求值并得到适当的结果,但是在 pry 中,函数是在 IEx 上下文中求值的(可以这么说),所以如果我们检查当前模块,我们将再次得到 nil。

iex(1)> Test.foo
Test
# ... we skip pry ceremony
pry(1)> __MODULE__
nil

现在我们可以看到发生了什么以及为什么我们不能从 IEx.pry

执行私有函数

我理解如果您来自 ruby 背景,这会是多么令人惊讶,因为只要您在正确对象或 [=33] 的上下文中评估块,您几乎可以访问任何您想要的内容=],但 elixir 中的函数调度根本不同。