使用pry,通过edit-method命令可以非常简单地找到定义方法的位置并查看源代码。然而,阶级本身并没有对应关系。当该类本身没有定义方法时,很难通过pry定位源代码。类是常量,所以这相当于询问在哪里可以找到定义了特定Ruby常量的源代码。非常感谢
pry
edit-method
mbyulnm01#
从Ruby 2.7开始,有一种更好的方法可以做到这一点,那就是Module.const_source_location。
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
yiytaume2#
在ruby中,$"保存所有通过Kernel.load加载的文件名。所以你可以尝试这样的东西:
$"
Kernel.load
constant = User $".detect{|load_path| load_path.include?(constant.to_s.underscore) }
注意:方法underscore是Rails/ActiveSupport的一部分
underscore
btqmn9zl3#
使用ack,有时如果我达到了Pry(和Ruby)的极限,我会使用它。它的优点是你可以使用它的shell集成功能从Pry本身调用它,通常只需输入.ack ClassName就可以了,但是它要求类在当前目录下的文件中定义。如果这个类没有在当前目录中定义,那么你总是可以求助于查找它的一个方法,从那里获取源位置,然后使用Pry的cat命令来显示它(语法高亮显示),或者使用Pry的edit命令直接跳转到它的定义。一个类没有定义任何示例方法的情况是相当罕见的--这样的类通常是很无趣的:)
.ack ClassName
编辑:
最新版本的Pry(0.9.9)现在可以使用普通的show-source命令显示模块/类的源代码。它要求模块/类至少有一个已定义的方法,
show-source
tjjdgumg4#
一种用于调试目的的黑客方法:启动一个控制台(例如binding.irb)并重新定义常量。你会得到一个错误消息与以前的定义路径!
binding.irb
> Foo = "" (irb):11: warning: already initialized constant Foo /path/to/foo.rb:1: warning: previous definition of Foo was here => ""
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没有帮助,但总比没有好。
class Foo; BAHZ = 2; end
zengzsys6#
那么你可以尝试Module.constants(true),如所述here它可能需要比使用pry提供的更多一点,但它会让你有机会窥视到所涉及的模块
Module.constants(true)
6条答案
按热度按时间mbyulnm01#
从Ruby 2.7开始,有一种更好的方法可以做到这一点,那就是
Module.const_source_location
。参考文献:
来自@ulysse-bn的奖金:
要快速访问此方法,您可以将其添加到IRB配置中,如下所示:
~/.irbrc
yiytaume2#
在ruby中,
$"
保存所有通过Kernel.load
加载的文件名。所以你可以尝试这样的东西:注意:方法
underscore
是Rails/ActiveSupport的一部分btqmn9zl3#
使用ack,有时如果我达到了Pry(和Ruby)的极限,我会使用它。它的优点是你可以使用它的shell集成功能从Pry本身调用它,通常只需输入
.ack ClassName
就可以了,但是它要求类在当前目录下的文件中定义。如果这个类没有在当前目录中定义,那么你总是可以求助于查找它的一个方法,从那里获取源位置,然后使用Pry的cat命令来显示它(语法高亮显示),或者使用Pry的edit命令直接跳转到它的定义。
一个类没有定义任何示例方法的情况是相当罕见的--这样的类通常是很无趣的:)
编辑:
最新版本的Pry(0.9.9)现在可以使用普通的
show-source
命令显示模块/类的源代码。它要求模块/类至少有一个已定义的方法,tjjdgumg4#
一种用于调试目的的黑客方法:启动一个控制台(例如
binding.irb
)并重新定义常量。你会得到一个错误消息与以前的定义路径!6bc51xsx5#
如果要查找的常量具有方法(是类或模块),则可以使用Method类查找它的定义位置。
一个小技巧,对纯常量
class Foo; BAHZ = 2; end
没有帮助,但总比没有好。zengzsys6#
那么你可以尝试
Module.constants(true)
,如所述here它可能需要比使用pry
提供的更多一点,但它会让你有机会窥视到所涉及的模块