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

我们最近遇到了一个问题,在一系列提交发生后,后端进程无法运行。现在,我们都是好孩子,每次签入后都会运行rake测试,但由于Rails库加载中的一些奇怪之处,只有在生产模式下直接从Mongrel运行时才会发生

我追踪到了这个bug,这是由于一个新的Rails gem覆盖了String类中的一个方法,打破了运行时Rails代码中的一个狭隘用法

总之,长话短说,有没有办法在运行时询问Ruby在哪里定义了方法?类似于wheremi(:foo)的东西,它返回/path/to/some/file.rb行#45?在这种情况下,告诉我它是在类字符串中定义的是没有帮助的,因为它被某个库重载了

我不能保证源代码存在于我的项目中,因此搜索'def foo'不一定能满足我的需要,更不用说如果我有多个def foo,有时我直到运行时才知道我可能使用哪一个

这真的很晚了,但以下是如何找到方法的定义位置:

http://gist.github.com/76951

如何找出方法的来源。
#这是在教授高级Ruby Studio时从Dave Thomas那里学到的
#有理由将方法定义分离为
#模块,尤其是在增强内置类时。
模块犯罪人
定义犯罪
终止
终止
类Fixnum
包括犯罪人
终止
方法(:犯罪)#这里的“2”是Fixnum的一个实例。
#<方法:Fixnum(犯罪人)#犯罪>

如果您使用的是Ruby 1.9+,则可以使用source\u location

需要“csv”
p CSV.new('string')。方法(:flock)
#=&gt#&书信电报;方法:CSV#flock>
CSV.new('string')。方法(:flock)。源位置
#=>[“/path/to/ruby/1.9.2-p290/lib/ruby/1.9.1/forwardable.rb”,180]

请注意,这不会在所有情况下都起作用,比如本机编译代码。Method类也有一些简洁的函数,比如Method#owner,它返回定义方法的文件

编辑:另一个答案中的\uuuu文件\uuu行以及REE注释也很方便工作组

发表评论