获取方法定义的最后一行

时间:2012-12-04 15:38:38

标签: ruby metaprogramming

有没有办法知道方法定义的最后一行的位置,而无需使用解析器(除了在Ruby实现本身下运行的解析器)或正则表达式或任何外部库来解析源代码?< / p>

通过使用set_trace_funcmethod_added提供的信息很容易获得方法定义的第一行,因为它们是在方法定义时触发的,我可以分析信息提供(直接来自set_trace_func或解析来自caller的{​​{1}}信息)。

但是对于方法定义的最后一行,我能做的最好的事情是查找下一个方法定义的第一行或method_added检测到的其他call。我可以告诉原始方法定义已经以此行结束,但无法判断它是否早于该行结束。例如,假设我正在尝试获取方法set_trace_func定义的最后一行。如果源代码如下所示:

foo

鉴于 | def foo | ... n | end; def bar | ... 定义的第一行是bar,我可以(巧合地)告诉n定义的最后一行是foo。但如果源代码恰好如下所示:

n

然后我想将 | def foo | ... n-1 | end n | def bar 作为n-1的最后一行,在这种情况下我无法确定是foo而不是n-1 }。源代码可能还有空/注释行,如下所示:

n

并且我仍然得到 | def foo | ... n-9 | end | | # comment | | =begin | ... | =end | n-1 | n | def bar 而不是正确的n-1并不是一个大问题,但是获得n-9是一个大问题。

1 个答案:

答案 0 :(得分:1)

由于您知道如何获取方法第一行的编号,因此您只需要the number of lines the method's definition has。您将前者添加到后者,并且您已获得最后一行的编号。

让我们调整链接问题中的示例来检查Set#add

require 'pry'
require 'set'
number_of_lines = Pry::Method.from_str("Set#add").source.lines.count

Pry's author所述,Pry使用Ruby的内置解析器来提取源代码。