2016-05-09 18 views
9

Kann elixir's private Methoden aus dem Modul ausführen? ZB:Elixir Pry kann keine privaten Methoden ausführen?

defmodule Test do 
    require IEx 

    def foo do 
    IEx.pry 
    end 

    defp bar do 
    end 
end 

An welcher Stelle ein Aufruf an bar funktioniert nicht. Ich bin Elixier sehr neu, gibt es etwas, was ich falsch mache oder einen Grund, warum das nicht möglich ist?

Antwort

10

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.