我的情况是我写的一个宝石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
无关,而是与另一行{{1}相关联我的宝石require
(http://gihub.com/boris-s/sy),您可以sy
安装。通过踩宝石(https://github.com/boris-s/sy/blob/master/lib/sy.rb),我发现所有需要的行或gem install sy
行之前的顶行都不会触发module SY
外观。 Net
定义确实如此。
此外,我发现实用答案module SY
与Net
一样Net
。作者没有假设有人会使用其他类型的网络而不是互联网,我没有考虑Net::HTTP
,因为我正在使用Petri网并定义我自己的Net::HTTP
类。虽然我解决了我的实际问题,但找到模块源代码的一般答案仍然很有意思。
答案 0 :(得分:5)
假设已加载文件,您可以执行以下操作:
$LOADED_FEATURES.select { |file| File.read(file).include?('module Foo') rescue false }
答案 1 :(得分:1)
如评论中所述,您还可以使用Enumerable#grep
查找模块的路径:
$LOADED_FEATURES.grep(/module_name/)