有没有办法知道方法定义的最后一行的位置,而无需使用解析器(除了在 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
而不是一个大问题。