Ich möchte wissen, ob ich im laufenden Betrieb Quellcode für eine Methode erhalten kann und ob ich die Datei erhalten kann, in der sich diese Methode befindet.
mögen
A.new.method(:a).SOURCE_CODE
A.new.method(:a).FILE
Verwendung source_location
:
class A
def foo
end
end
file, line = A.instance_method(:foo).source_location
# or
file, line = A.new.method(:foo).source_location
puts "Method foo is defined in #{file}, line #{line}"
# => "Method foo is defined in temp.rb, line 2"
Beachten Sie, dass für builtin Methoden, source_location
kehrt nil
. Wenn Sie den C-Quellcode überprüfen möchten (viel Spaß!), Müssen Sie nach der richtigen C-Datei suchen (sie sind mehr oder weniger nach Klassen organisiert) und die rb_define_method
für die Methode finden (gegen Ende der Datei) ).
In Ruby 1.8 existiert diese Methode nicht, aber Sie können dieses Juwel verwenden .
String#include?
. SoweitString.instance_method(:include?).source_location
kehrt zurücknil
.Keine der bisherigen Antworten zeigt, wie der Quellcode einer Methode im laufenden Betrieb angezeigt wird ...
Es ist eigentlich sehr einfach, wenn Sie das großartige Juwel 'method_source' von John Mair (dem Hersteller von Pry) verwenden: Die Methode muss in Ruby (nicht C) implementiert und aus einer Datei (nicht irb) geladen werden.
Hier ist ein Beispiel für die Anzeige des Methodenquellcodes in der Rails-Konsole mit method_source:
Siehe auch:
quelle
source
. Dies funktioniert wie erwartet.[1] pry(main)> RSpec.method(:class_exec).source
MethodSource::SourceNotFoundError: Could not locate source for class_exec!
from /home/vagrant/.bundle/foo/ruby/2.5.0/gems/method_source-0.9.2/lib/method_source.rb:24:in `source_helper'
RSpec.method(:to_json).source_location
funktioniert aber gutSo drucken Sie den Quellcode von Ruby aus:
quelle
Ohne Abhängigkeiten
Wenn Sie dies bequemer verwenden möchten, können Sie die
Method
Klasse öffnen :Und dann einfach anrufen
method.source
Mit Pry können Sie die verwenden
show-method
, um eine Methodenquelle anzuzeigen, und Sie können sogar Ruby C-Quellcode mitpry-doc
installiertem Code anzeigen, wie in Prys Dokument in Codde-Browing angegebenquelle
source
Methode innerhalb derMethod
Klasse. Es wäre sogar noch besser, wenn der Text verarbeitet würde und neu, wann der Druckvorgang beendet werden soll, da das Ende der Methode erreicht ist.Zu diesem Zweck habe ich das Juwel "ri_for" erstellt
... gibt die Quelle aus (und den Ort, wenn Sie auf 1.9 sind).
GL. -r
quelle
Ich musste eine ähnliche Funktion (greifen Sie nach der Quelle eines Blocks) als Teil von Wrong implementieren, und Sie können sehen, wie (und vielleicht sogar den Code wiederverwenden) in chunk.rb (das sich auf Ryan Davis 'RubyParser stützt, sowie einige ziemlich lustige Quelldatei glomming Code ). Sie müssten es ändern, um es zu verwenden,
Method#source_location
und vielleicht einige andere Dinge optimieren, damit es das enthält oder nichtdef
.Übrigens, ich denke, Rubinius hat diese Funktion eingebaut. Aus irgendeinem Grund wurde sie aus der MRT (der Standard-Ruby-Implementierung) herausgelassen, daher dieser Hack.
Oooh, ich mag einige Sachen in method_source ! Wie mit eval zu sagen , ob ein Ausdruck gültig ist (und halten glomming Source - Leitungen , bis Sie aufhören immer Parse - Fehler, wie Chunk der Fall ist) ...
quelle
Interne Methoden haben keine Quelle oder Quellenort (zB
Integer#to_s
)quelle