Подтвердить что ты не робот

Как найти расположение модуля

Я в ситуации, что n gem foo_bar, который я написал, и который я использую следующим образом:

require 'foo_bar'
include FooBar

suddendly, появилась константа Baz:

defined? Baz #=> :constant
Baz.class #=> Module

Я забыл, где я определил Baz. Если у него были какие-либо методы экземпляра, я мог бы использовать метод #source_location, чтобы найти файл, в котором я определил Baz. Но он не имеет:

Baz.instance_methods #=> []

Как найти, в каком файле (или где) указан модуль, который появился в моем верхнем пространстве имен?

Дополнительная запись и поиск: Постоянная, о которой я говорю, это Net, и ее внешний вид не привязан к include FooBar, а к другой строке, require моего драгоценного камня sy (http://gihub.com/boris-s/sy), которую вы можете установить с помощью gem install sy. Нажав драгоценный камень (https://github.com/boris-s/sy/blob/master/lib/sy.rb), я обнаружил, что ни одна из строк запроса или верхние строки до строки module SY не делает не запускать Net внешний вид. Определение module SY делает.

Кроме того, я нашел прагматичный ответ Net Net, как в Net::HTTP. Авторы не предполагали, что кто-то будет работать с другими видами сетей, чем с сетями, и я не думал о Net::HTTP, потому что я работал с сетями Петри и определял свои собственные классы Net. Хотя я решил свою практическую проблему, все же интересно найти общий ответ на поиск источников модулей.

4b9b3361

Ответ 1

Предполагая, что файл загружен, вы можете:

$LOADED_FEATURES.select { |file| File.read(file).include?('module Foo') rescue false }

Ответ 2

Это может сделать трюк (Ruby 1.9+):

method(:Baz).source_location

Пример:

2.1.0 :001 > require 'json'
=> true
2.1.0 :002 > JSON.class
=> Module
2.1.0 :003 > method(:JSON).source_location
=> ["/usr/local/Cellar/ruby/2.1.1/lib/ruby/2.1.0/json/common.rb", 466]

Старые версии Ruby имели другие способы, такие как Baz.__file__, но были заменены на source_location в 1.9+. Вы также можете исследовать Gem, который помогает, например method_locator (https://github.com/ryanlecompte/method_locator).