如何查找模块的位置

时间:2014-03-07 01:08:45

标签: ruby

我的情况是我写的一个宝石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}相关联我的宝石requirehttp://gihub.com/boris-s/sy),您可以sy安装。通过踩宝石(https://github.com/boris-s/sy/blob/master/lib/sy.rb),我发现所有需要的行或gem install sy行之前的顶行都不会触发module SY外观。 Net定义确实如此。

此外,我发现实用答案module SYNet一样Net。作者没有假设有人会使用其他类型的网络而不是互联网,我没有考虑Net::HTTP,因为我正在使用Petri网并定义我自己的Net::HTTP类。虽然我解决了我的实际问题,但找到模块源代码的一般答案仍然很有意思。

2 个答案:

答案 0 :(得分:5)

假设已加载文件,您可以执行以下操作:

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

答案 1 :(得分:1)

如评论中所述,您还可以使用Enumerable#grep查找模块的路径:

$LOADED_FEATURES.grep(/module_name/)