Das ist das erwartete Verhalten, da IEx.pry Ihnen Zugriff auf die lokalen Variablen für die Funktionen gewährt, für die es aufgerufen wird, aber Sie befinden sich nicht im Bereich des Moduls, in dem es sich befindet.
Von der IEx.pry
Dokumentation:
Wenn ein Prozess aufgebrochen wird, läuft der gesamte Code innerhalb IEx und als solche, es wird ausgewertet und privaten Zugriff auf keine Funktionen des Moduls ausgeforscht werden. Modulfunktionen müssen weiterhin über Mod.fun (args) aufgerufen werden.
Zur weiteren Veranschaulichung können Sie den Wert __MODULE__
überprüfen. Er wertet auf Null, wenn Sie es von IEx laufen (weil Sie nicht in einem defmodule Block sind):
iex(1)> __MODULE__
nil
Wenn Sie foo
ändern würde das aktuelle Modul zu inspizieren würden Sie keine Überraschungen,:
defmodule Test do
require IEx
def foo do
IO.inspect __MODULE__
IEx.pry
end
defp bar do
end
end
Jetzt bewerten wir in iex und erhalten das entsprechende Ergebnis, aber in der Tat werden die Funktionen im IEx-Kontext ausgewertet (sozusagen), so würden wir wieder Null, wenn wir das aktuelle Modul überprüfen.
iex(1)> Test.foo
Test
# ... we skip pry ceremony
pry(1)> __MODULE__
nil
Jetzt können wir sehen, was los ist und warum wir nicht privat Funktionen von IEx.pry
ausführen kann ich verstehen, wie diese überraschend sein kann, wenn man von einem Rubin Hintergrund kommen, da können Sie Wenn Sie einen Block im Kontext des richtigen Objekts oder der richtigen Klasse auswerten, greifen Sie ziemlich genau auf das, was Sie wollen, aber die Funktion, die in Elixir verteilt wird, unterscheidet sich grundlegend.