Ruby hat offene Klassen, die sehr praktisch sind (obwohl sie von einigen geschmäht werden), und Elixir leiht sich stark aus Ruby, also erwartete ich, dass Elixir mir erlaubt, ein Modul wieder zu öffnen und Makros hinzuzufügen, nachdem ich es geschlossen hatte, aber das tat es funktioniert nicht so, wie ich es versucht habe. Gibt es einen Weg, dies zu tun? Ist diese Funktion noch in Elixir verfügbar?
Um das konkret zu machen, nehmen wir ein Beispiel aus Chris McCords Metaprogramming Elixier:
%Vor%Wenn ich dann ein Makro für die Subtraktion hinzufügen
%Vor%Ich bekomme eine Warnung, dass ich Modul Math neu definiere und die anfänglich definierten Makros fehlschlagen. Offensichtlich ist mein Ansatz nicht der richtige, aber gibt es einen anderen Ansatz, der das gleiche Ziel erreichen kann?
Sie können ein Modul nicht erneut öffnen. Da Elixir eine kompilierte Sprache ist, ist der Weg vom Quellcode zu einer ausführbaren Darstellung in einer Richtung. Die Mechanismen, die Code ändern, wie Makros, werden während der Kompilierungszeit ausgewertet. Mit Elixir können Sie jedoch Hot-Code-Swapping durchführen, d. e. Sie können ein kompiliertes Modul zur Laufzeit ersetzen.
Ich denke, das hat einige interessante Auswirkungen. Sie haben die Möglichkeit, das Programm zur Laufzeit zu ändern - in der Praxis steuern Sie den Quellcode und Sie können einzelne Teile eines Moduls austauschen, ohne andere zu ändern. Dennoch mag ich die Idee, alles an einem Ort zu haben. Wenn du in Elixir ein Modul ansiehst, weißt du genau, was du hast *.
Wenn es sich also nur um einen praktischen Entwicklungs-Workflow handelt, kommt es am nächsten an Rubys Fähigkeit, Methoden zu einer Klasse hinzuzufügen, indem Sie Ihr Modul in einer Datei speichern und es dann von iex neu kompilieren.
* Genau genommen können Sie nicht genau wissen, welcher Code gerade ausgeführt wird, indem Sie einfach ein Modul ansehen. Wenn Sie Protokolle verwenden, müssen Sie sich auch alle Protokollimplementierungen ansehen, die möglicherweise in Ihrer Codebase verstreut sind, oder, schlimmer noch, sie können über mehrere Anwendungen verteilt sein.
Tags und Links elixir