elixir的pry可以在模块中运行私有方法吗?例如:
defmodule Test do
require IEx
def foo do
IEx.pry
end
defp bar do
end
end
此时对bar
的调用无效。我对elixir很新,有什么我做错了或者为什么这是不可能的?
答案 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中的函数调度基本上是不同。