1

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

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

但是对于一个方法定义的最后一行,我能做的最好的就是寻找下一个方法定义的第一行或者其他callset_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而不是一个大问题。

4

1 回答 1

1

由于您知道如何获取方法的第一行的编号,因此您只需要方法定义的行数即可。您将前者添加到后者,您就得到了最后一行的编号。

让我们将链接问题中的示例改编为 inspect Set#add

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

正如Pry 的作者所指出的,Pry 使用 Ruby 的内置解析器来提取源代码。

于 2012-12-04T22:04:44.867 回答