如何找到Ruby中定义常量的位置?

kkih6yb8  于 12个月前  发布在  Ruby
关注(0)|答案(6)|浏览(96)

使用pry,通过edit-method命令可以非常简单地找到定义方法的位置并查看源代码。然而,阶级本身并没有对应关系。当该类本身没有定义方法时,很难通过pry定位源代码。
类是常量,所以这相当于询问在哪里可以找到定义了特定Ruby常量的源代码。非常感谢

mbyulnm0

mbyulnm01#

从Ruby 2.7开始,有一种更好的方法可以做到这一点,那就是Module.const_source_location

> Admin.const_source_location(:LIMIT)
#=> ["SOME_PATH/user.rb", 2]

参考文献:

来自@ulysse-bn的奖金:

要快速访问此方法,您可以将其添加到IRB配置中,如下所示:

  • ~/.irbrc
# displays path of constant
#
# Usage:
#
#     _source_location(::ActiveRecord::Base)
#
def _source_location(const)
  Object.const_source_location(const.name)
end
yiytaume

yiytaume2#

在ruby中,$"保存所有通过Kernel.load加载的文件名。所以你可以尝试这样的东西:

constant = User
$".detect{|load_path|
  load_path.include?(constant.to_s.underscore)
}

注意:方法underscore是Rails/ActiveSupport的一部分

btqmn9zl

btqmn9zl3#

使用ack,有时如果我达到了Pry(和Ruby)的极限,我会使用它。它的优点是你可以使用它的shell集成功能从Pry本身调用它,通常只需输入.ack ClassName就可以了,但是它要求类在当前目录下的文件中定义。
如果这个类没有在当前目录中定义,那么你总是可以求助于查找它的一个方法,从那里获取源位置,然后使用Pry的cat命令来显示它(语法高亮显示),或者使用Pry的edit命令直接跳转到它的定义。
一个类没有定义任何示例方法的情况是相当罕见的--这样的类通常是很无趣的:)

编辑

最新版本的Pry(0.9.9)现在可以使用普通的show-source命令显示模块/类的源代码。它要求模块/类至少有一个已定义的方法,

tjjdgumg

tjjdgumg4#

一种用于调试目的的黑客方法:启动一个控制台(例如binding.irb)并重新定义常量。你会得到一个错误消息与以前的定义路径!

> Foo = ""
(irb):11: warning: already initialized constant Foo
/path/to/foo.rb:1: warning: previous definition of Foo was here
=> ""
6bc51xsx

6bc51xsx5#

如果要查找的常量具有方法(是类或模块),则可以使用Method类查找它的定义位置。

class Foo
  def bar
  end

  def self.baz
  end
end

Foo.instance_method(:bar).source_location
Foo.method(:baz).source_location

一个小技巧,对纯常量class Foo; BAHZ = 2; end没有帮助,但总比没有好。

zengzsys

zengzsys6#

那么你可以尝试Module.constants(true),如所述here它可能需要比使用pry提供的更多一点,但它会让你有机会窥视到所涉及的模块

相关问题