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

Min*_*Pan 23 ruby constants

使用pry,可以非常简单地找到定义方法的位置并查看source by edit-method命令.然而,课堂本身没有对应关系.当该类没有自己定义的方法时,很难找到源代码pry.

类是常量,所以它等同于询问在哪里找到定义特定Ruby常量的源.非常感谢你.

Ale*_*lex 13

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

constant = User
$".detect{|load_path|
  load_path.include?(constant.to_s.underscore)
}
Run Code Online (Sandbox Code Playgroud)

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


hor*_*guy 8

使用ack,有时如果我达到Pry(和Ruby)的极限我会求助于它.关于它的好处是你可以使用它的shell集成功能从Pry内部调用它,通常只需键入.ack ClassName就可以了,但是它需要在当前目录下的文件中定义类.

如果在当前目录中没有定义类,那么你总是可以求助于查找其中一个方法,从那里获取源位置,然后使用Pry的cat命令显示它(带语法高亮显示)或Pry's 编辑命令直接跳转到其定义.

一个类没有定义任何实例方法的情况是相当罕见的 - 无论如何这样的类通常是无趣的:)

编辑:

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


Chr*_*erg 7

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

> Admin.const_source_location(:LIMIT)
#=> ["SOME_PATH/user.rb", 2]
Run Code Online (Sandbox Code Playgroud)

参考:

  • 另一个有用的片段:`Object.const_source_location('Admin::LIMIT')` (4认同)

Uly*_* BN 5

用于调试目的的一种巧妙方法:启动控制台(例如使用binding.irb)并重新定义常量。您将收到一条错误消息,其中包含先前的定义路径!

> Foo = ""
(irb):11: warning: already initialized constant Foo
/path/to/foo.rb:1: warning: previous definition of Foo was here
=> ""
Run Code Online (Sandbox Code Playgroud)