如何查找模块的位置

Bor*_*cky 12 ruby

我的情况是foo_bar我写的na gem ,我使用如下:

require 'foo_bar'
include FooBar
Run Code Online (Sandbox Code Playgroud)

突然Baz出现,不断出现:

defined? Baz #=> :constant
Baz.class #=> Module
Run Code Online (Sandbox Code Playgroud)

我忘了我在哪里定义Baz.如果它有任何实例方法,我可以使用#source_location方法来查找我定义的文件Baz.但它没有:

Baz.instance_methods #=> []
Run Code Online (Sandbox Code Playgroud)

如何找到在我的顶级命名空间中弹出的模块在哪个文件(或哪里)?

额外的添加和发现:我所说的常数是Net,它的外观与我的宝石(http://gihub.com/boris-s/sy)的include FooBar另一行无关,你可以通过它安装.通过踩宝石(https://github.com/boris-s/sy/blob/master/lib/sy.rb),我发现没有任何需要的行,或者直到行的顶行都没有触发出现.的定义一样.requiresygem install symodule SYNetmodule SY

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

Jar*_*eck 10

.. 出现了一个不变的 Baz .. 我忘记了我在哪里定义了 Baz 。

Ruby 2.7 添加了const_source_location.

Object.const_source_location('Baz')
#=> ["/../app/models/baz.rb", 3]
Run Code Online (Sandbox Code Playgroud)


Jas*_*rip 5

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

$LOADED_FEATURES.select { |file| File.read(file).include?('module Foo') rescue false }
Run Code Online (Sandbox Code Playgroud)