我的情况是 n 个我编写的 gem foo_bar
,我按如下方式使用它:
require 'foo_bar'
include FooBar
突然,一个常量Baz
出现了:
defined? Baz #=> :constant
Baz.class #=> Module
我忘了我在哪里定义了Baz
。如果它有任何实例方法,我可以使用 #source_location
方法找到我定义 Baz
的文件。但它没有:
Baz.instance_methods #=> []
我如何找到在哪个文件(或哪里)定义了在我的顶级命名空间中弹出的模块?
附加任务和发现:我说的常量是Net
,它的出现与include FooBar
无关,而是另一行,require
我的 gem sy
( http://gihub.com/boris-s/sy ),您可以通过 gem install sy
安装它。通过步进 gem ( https://github.com/boris-s/sy/blob/master/lib/sy.rb ),我发现没有任何 require 行,或者 module SY
行的顶部行不会触发 Net
外观。 module SY
定义。
此外,我发现实用的答案Net
是Net
,如Net::HTTP
。作者没有假设有人会使用互联网以外的其他类型的网络,我也没有考虑 Net::HTTP
,因为我正在使用 Petri 网并定义我自己的 Net
类。虽然我解决了我的实际问题,但找到查找模块源的一般答案仍然很有趣。
最佳答案
假设文件已加载,您可以执行以下操作:
$LOADED_FEATURES.select { |file| File.read(file).include?('module Foo') rescue false }
关于ruby - 如何找到模块的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22239501/