Ich bin in einer Situation zu finden, die gem na foo_bar
, die ich geschrieben habe, und die ich wie folgt verwenden:eines Moduls Standort
require 'foo_bar'
include FooBar
suddendly, eine Konstante Baz
erschienen:
defined? Baz #=> :constant
Baz.class #=> Module
Ich habe vergessen, wo ich Baz
definiert habe. Wenn es irgendwelche Instanzmethoden hatte, könnte ich #source_location
Methode verwenden, um die Datei zu finden, wo ich Baz
definierte. Aber es hat keine:
Baz.instance_methods #=> []
Wie finde ich, in der Datei (oder wo) ein Modul, das in meiner Top-Namespace tauchte definiert?
Zusätzliche addmission und Befund: Die Konstante ich rede ist Net
, und sein Aussehen ist nicht gebunden an include FooBar
, sondern auf eine andere Linie, require
meiner gem sy
(http://gihub.com/boris-s/sy), die Sie durch gem install sy
installieren können. Durch Treten des Edelsteins (https://github.com/boris-s/sy/blob/master/lib/sy.rb) habe ich festgestellt, dass keine der erforderlichen Zeilen oder die oberen Zeilen bis zur module SY
Zeile nicht Net
aussehen. Die module SY
Definition tut dies.
Außerdem, fand ich die pragmatische Antwort Net
Net
wie in Net::HTTP
ist. Die Autoren nahmen nicht an, dass jemand mit anderen Arten von Netzen als mit Internet arbeiten würde, und ich dachte nicht an Net::HTTP
, weil ich mit Petrinetzen arbeitete und meine eigenen Net
Klassen definierte. Obwohl ich mein praktisches Problem gelöst habe, ist es immer noch interessant, die allgemeine Antwort zu finden, Quellen von Modulen zu finden.
Ich weiß nicht, die Antwort noch nicht, aber die gute Nachricht ist, wenn Sie MRI Ruby-verwenden, wird der Quellort definitiv gespeichert. Die Definition der Funktion 'rb_const_set' die folgenden Linien enthält: ' ce = ALLOC (rb_const_entry_t); '' MEMZERO (CE, rb_const_entry_t, 1); '' CE-> Flag = Sichtbarkeit; '' CE- > line = rb_sourceline(); ' –
Es scheint, dass es gespeichert wird, so dass es in der Warnung" vorherige Definition von% s war hier "zurück gerufen werden kann, aber ich habe Mühe, diese Warnung zu bekommen, um jetzt tatsächlich zu erscheinen . Ich bekomme nur immer '' bereits initialisierte Konstante% s ''. –
Schöne Frage, lass es mich auch versuchen. –