如何在运行时找到一个方法的定义位置?

353

我们最近遇到了一个问题,一系列提交之后,一个后端进程无法运行。我们很有良心地在每次检入后都运行了 rake test ,但由于Rails库加载中的某些奇怪问题,只有当我们直接从Mongrel以生产模式运行它时才会发现此问题。

我追踪到这个bug的原因是一个新的Rails gem在 String 类中重写了一个方法,导致在运行时的Rails代码中出现了一些狭窄的使用问题。

总之,长话短说,是否有一种在运行时询问Ruby方法定义位置的方法?类似于 whereami(:foo) ,返回 /path/to/some/file.rb line #45 的结果?在这种情况下,告诉我它是在 String 类中定义的将没有任何帮助,因为它被某个库重载了。

我无法保证源代码位于我的项目中,所以用 'def foo' 进行全局搜索并不能给我想要的结果,更不用说如果我有许多 def foo ,有时我直到运行时才知道哪一个我可能正在使用。


1
在Ruby 1.8.7中,专门添加了一种特殊的方法来查找这些信息(在1.9.3中仍然存在)...详见下面我的回答。 - Alex D
很多年前,我写了一篇文章回答了这些问题 https://blog.widefix.com/find-method-source-location/ - ka8725
11个回答

0

对于希望在 Rails 应用中执行此操作的任何人,您可以在方法调用的相同范围内使用 pry gem(在本示例中,该方法是 render 用于 Rails 视图,因此我将其放在视图中的其前面):

<% binding.pry %>

然后在调试器中运行了这个,它显示了被调用的方法的确切位置。
method(:render).source_location                       
=> ["/Users/st/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/actionview-7.0.5/lib/action_view/helpers/rendering_helper.rb",
 30]

(重要的部分是最后,显示方法来自的命名空间)

gems/actionview-7.0.5/lib/action_view/helpers/rendering_helper.rb

从那里,您可以确定应该查看文档的哪个部分:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接