使用pry
,可以非常简单地找到定义方法的位置,并通过edit-method
命令查看源代码。然而,课堂本身没有对应关系。当该类没有自己定义的方法时,很难通过pry
找到源。
类是常量,所以它等同于询问在哪里找到定义特定Ruby常量的源。非常感谢你。
答案 0 :(得分:12)
在ruby中,$"
包含通过Kernel.load
加载的所有文件名。
所以你可以尝试这样的事情:
constant = User
$".detect{|load_path|
load_path.include?(constant.to_s.underscore)
}
注意:方法underscore
是Rails / ActiveSupport
答案 1 :(得分:8)
使用ack,有时如果达到Pry(和Ruby)的限制,我会使用它。关于它的好处是你可以使用它的shell集成功能从Pry内部调用它,通常只需键入.ack ClassName
即可,但它需要在当前目录下的文件中定义类。
如果在当前目录中没有定义类,那么您总是可以求助于查找其中一个方法,从那里获取源位置,然后使用Pry的cat命令来显示它(使用语法高亮显示)或Pry的edit命令直接跳转到其定义。
一个类没有定义任何实例方法的情况相当罕见 - 而且这样的类通常都是无趣的:)
修改强>:
最新版本的Pry(0.9.9)现在可以使用普通show-source
命令显示模块/类的来源。它要求模块/类至少有一个已定义的方法
答案 2 :(得分:4)
如果您要查找的常量具有方法(是类或模块),则可以使用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
没有帮助,但它总比没有好。
答案 3 :(得分:4)
从Ruby 2.7开始,还有一种更好的方法是Module.const_source_location
。
> Admin.const_source_location(:LIMIT)
#=> ["SOME_PATH/user.rb", 2]
参考:
答案 4 :(得分:1)
您可以按照here尝试Module.constants(true)
这可能比使用pry
优惠要多一些,但它可以让您有机会查看所涉及的模块
答案 5 :(得分:1)
一种用于调试目的的怪异方式:启动控制台(例如,使用binding.irb
)并重新定义常量。您会收到一条带有先前定义路径的错误消息!
> Foo = ""
(irb):11: warning: already initialized constant Foo
/path/to/foo.rb:1: warning: previous definition of Foo was here
=> ""