使用
pry
,可以非常简单地找到定义方法的位置并通过edit-method
命令查看源代码。然而,阶级本身没有对应关系。当该类没有自己定义方法时,很难通过pry
找到来源。
类是常量,因此相当于询问在哪里可以找到定义特定 Ruby 常量的源代码。非常感谢。
从 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
在 ruby 中,
$"
保存通过 Kernel.load
加载的所有文件名。
所以你可以尝试这样的事情:
constant = User
$".detect{|load_path|
load_path.include?(constant.to_s.underscore)
}
注意:方法
underscore
是Rails/ActiveSupport的一部分
使用ack,有时如果我达到了 Pry(和 Ruby)的极限,我就会求助于使用它。它的优点是您可以使用其 shell 集成功能从 Pry 本身内部调用它,通常只需键入
.ack ClassName
即可达到目的,但是它要求该类在当前目录下的文件中定义。
如果该类未在当前目录中定义,那么您始终可以查找其方法之一,从那里获取源位置,然后使用 Pry 的 cat 命令显示它(带有语法突出显示) ) 或 Pry 的 edit 命令直接跳转到其定义。
类没有定义任何实例方法的情况相当罕见——而且这样的类通常很无趣:)
编辑:
最新版本的 Pry (0.9.9) 现在可以使用普通的
show-source
命令显示模块/类的源代码。然而,它要求模块/类至少有一个定义的方法
用于调试目的的一种巧妙方法:启动控制台(例如使用
binding.irb
)并重新定义常量。您将收到一条错误消息,其中包含先前的定义路径!
> Foo = ""
(irb):11: warning: already initialized constant Foo
/path/to/foo.rb:1: warning: previous definition of Foo was here
=> ""
如果您要查找的常量具有方法(是类或模块),您可以使用 Method 类来查找它的定义位置。
class Foo
def bar
end
def self.baz
end
end
Foo.instance_method(:bar).source_location
Foo.method(:baz).source_location
有点 hack,对纯常量没有帮助
class Foo; BAHZ = 2; end
但总比没有好。