Entschuldigung für den schlecht formulierten Fragetitel - keine Ahnung, wie es besser ausgedrückt werden soll!
Wie kann ich im folgenden Code ruby bar.rb
ausführen, wie kann ich die Ausgabe bar.rb
anstatt foo.rb
?
In foo.rb
:
In bar.rb
:
Dies ist für eine Bibliotheksfunktion, die jedes Mal, wenn ein Code ausgeführt wird, den Ort (und git ref) dieses Codes aufzeichnet.
Ihre Frage hat mich dazu gebracht, die Ruby-Interpreter-Quelle zu öffnen und zu sehen, wie __FILE__
tatsächlich funktioniert. Die Antwort ist ziemlich interessant: Sie ist direkt im Parser implementiert. Der Lexer hat einen speziellen Tokentyp für __FILE__
. Wenn der Parser dieses Token sieht, wird es in eine String-Konstante umgewandelt, die den Namen der Datei enthält, an der der Parser gerade arbeitet.
Ab Zeile 14948 von ext / ripper / ripper.c:
%Vor% Ich denke, dies sollte klarstellen, dass es unmöglich ist, __FILE__
den Namen der Include-Datei zurückzugeben, es sei denn, Sie hacken die Ruby-Interpreter-Quelle oder schreiben Ihren eigenen Präprozessor, der __FILE__
in etwas anderes verwandelt Übergabe der Ruby-Quelle an den Interpreter!
Es gibt einen Trick, den Sie vielleicht anwenden können. Wenn Sie einen Block an die Methode übergeben, können Sie die Blockierung verwenden, um die Quelle zu bestimmen. Etwas wie:
%Vor%Aber das bedeutet wiederum, dass Sie einen Block passieren müssen.
Ehrlich gesagt, ich frage mich, was Sie zu erreichen versuchen, b / c außerhalb machen eine gemeinsame Kern-Erweiterung-Methode, das ist wahrscheinlich etwas, was Sie wirklich nicht wollen.
Tags und Links ruby