Elixir Pry无法执行私有方法?

时间:2016-05-09 01:11:09

标签: elixir pry

elixir的pry可以在模块中运行私有方法吗?例如:

defmodule Test do
  require IEx

  def foo do
    IEx.pry
  end

  defp bar do
  end
end

此时对bar的调用无效。我对elixir很新,有什么我做错了或者为什么这是不可能的?

1 个答案:

答案 0 :(得分:11)

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

来自IEx.pry文档:

  

当一个进程被撬开时,所有代码都在IEx中运行,因此,它被评估并且无法访问被撬的模块的私有函数。仍然需要通过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

执行私有函数

我理解如果你来自红宝石背景,这会是多么令人惊讶,因为你可以在正确的对象或类的上下文中评估一个块时可以访问你想要的任何东西,但是在elixir中的函数调度基本上是不同。