Wie kann ich aus einer enthaltenen Datei den Dateinamen der Datei erhalten, die den Include ausführt?

9

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 ?

ausgeben lassen?

In foo.rb :

%Vor%

In bar.rb :

%Vor%

Dies ist für eine Bibliotheksfunktion, die jedes Mal, wenn ein Code ausgeführt wird, den Ort (und git ref) dieses Codes aufzeichnet.

    
seb 15.10.2012, 11:35
quelle

2 Antworten

4

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!

    
Alex D 15.10.2012, 15:05
quelle
1

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.

    
trans 21.10.2012 12:36
quelle

Tags und Links