有没有一种方法可以知道方法定义的最后一行的位置,而不需要使用解析器(而不是在Ruby实现本身下运行的解析器)或regex或任何执行此操作的外部库来解析源代码?
使用set_trace_func或method_added提供的信息很容易获得方法定义的第一行,因为它们是在方法定义时触发的,我可以分析所提供的信息(直接从set_trace_func或从method_added解析caller信息)。
但是对于方法定义的最后一行,我所能做的最好的就是查找下一个方法定义的第一行或者set_trace_func检测到的其他call。我可以断定原来的方法定义已经在这一行结束了,但不能断定它是否在更早的一行中结束。例如,假设我正在尝试获取方法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是一个很大的问题。
发布于 2012-12-05 06:04:45
由于您知道如何获取方法的第一行的编号,因此只需使用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的内置解析器来提取源代码。
https://stackoverflow.com/questions/13706462
复制相似问题