有没有办法知道方法定义的最后一行的位置,而无需使用解析器(除了在 Ruby 实现本身下运行的解析器)或正则表达式或任何执行此操作的外部库来解析源代码?
通过使用set_trace_func或提供的信息很容易获得方法定义的第一行,method_added因为它们是在方法定义的时刻触发的,并且我可以分析提供的信息(直接来自set_trace_func或解析caller来自的信息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,但是得到n而不是一个大问题。