代码之家  ›  专栏  ›  技术社区  ›  Boris Stitnicky

如何查找模块的位置

  •  23
  • Boris Stitnicky  · 技术社区  · 10 年前

    我现在的处境很艰难 foo_bar 我所写的,并使用如下:

    require 'foo_bar'
    include FooBar
    

    突然,一个常数 Baz 出现:

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

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

    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 行未触发 外貌这个 模块SY 定义确实如此。

    此外 ,我找到了务实的答案 如中所示 Net::HTTP 作者并没有假设有人会使用互联网以外的其他网络,我也没有想过 Net::HTTP 因为我在使用Petri网并定义自己的 类。虽然我解决了我的实际问题,但找到找到模块来源的一般答案仍然很有趣。

    3 回复  |  直到 10 年前
        1
  •  15
  •   Jason Waldrip    10 年前

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

    $LOADED_FEATURES.select { |file| File.read(file).include?('module Foo') rescue false }
    
        2
  •  7
  •   Jared Beck    3 年前

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

    添加Ruby 2.7 const_source_location .

    Object.const_source_location('Baz')
    #=> ["/../app/models/baz.rb", 3]
    
        3
  •  2
  •   builder-7000    5 年前

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

    $LOADED_FEATURES.grep(/module_name/)