elixir的pry可以在模块中运行私有方法吗?例如:
defmodule Test do
require IEx
def foo do
IEx.pry
end
defp bar do
end
end
Run Code Online (Sandbox Code Playgroud)
此时呼叫bar
不起作用.我对elixir很新,有什么我做错了或者为什么这是不可能的?
ale*_*ros 11
这是预期的行为,因为IEx.pry允许您访问调用它的函数的本地变量,但它不会将您置于被模块的范围内.
从IEx.pry
文档:
当一个进程被撬开时,所有代码都在IEx中运行,因此,它被评估并且无法访问被撬出的模块的私有函数.仍然需要通过Mod.fun(args)访问模块功能.
为了进一步说明,您可以检查值__MODULE__
.如果从IEx运行它,它的结果为nil(因为你不在defmodule块中):
iex(1)> __MODULE__
nil
Run Code Online (Sandbox Code Playgroud)
如果您要修改foo
以检查当前模块,您将不会有任何意外:
defmodule Test do
require IEx
def foo do
IO.inspect __MODULE__
IEx.pry
end
defp bar do
end
end
Run Code Online (Sandbox Code Playgroud)
现在我们在iex中进行评估并获得适当的结果,但是在pry中,函数在IEx上下文中被评估(可以这么说),所以如果我们检查当前模块,我们将再次获得nil.
iex(1)> Test.foo
Test
# ... we skip pry ceremony
pry(1)> __MODULE__
nil
Run Code Online (Sandbox Code Playgroud)
现在我们可以看到发生了什么,以及为什么我们不能从IEx.pry执行私有函数
我理解如果你来自红宝石背景,这会是多么令人惊讶,因为你可以在正确的对象或类的上下文中评估一个块时可以访问你想要的任何东西,但是在elixir中的函数调度是根本不同的.