有没有办法知道方法定义的最后一行的位置,而无需使用解析器(除了在Ruby实现本身下运行的解析器)或正则表达式或任何外部库来解析源代码?< / p>
通过使用set_trace_func
或method_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
是一个大问题。
答案 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的内置解析器来提取源代码。