首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取方法定义的最后一行

获取方法定义的最后一行
EN

Stack Overflow用户
提问于 2012-12-04 23:38:38
回答 1查看 133关注 0票数 1

有没有一种方法可以知道方法定义的最后一行的位置,而不需要使用解析器(而不是在Ruby实现本身下运行的解析器)或regex或任何执行此操作的外部库来解析源代码?

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

但是对于方法定义的最后一行,我所能做的最好的就是查找下一个方法定义的第一行或者set_trace_func检测到的其他call。我可以断定原来的方法定义已经在这一行结束了,但不能断定它是否在更早的一行中结束。例如,假设我正在尝试获取方法foo定义的最后一行。在源码如下的情况下:

代码语言:javascript
复制
   | def foo
   |   ...
n  | end; def bar
   |   ...

鉴于bar定义的第一行是n,我可以(巧合地)断定foo定义的最后一行是n。但如果源代码恰好如下所示:

代码语言:javascript
复制
     | def foo
     |   ...
n-1  | end
n    | def bar

然后我想把n-1作为foo的最后一行,但是我想不出在本例中它是n-1而不是n。源代码可能还有类似于下面这样的空/注释行:

代码语言:javascript
复制
     | def foo
     |   ...
n-9  | end
     | 
     | # comment
     | 
     | =begin
     |   ...
     | =end
     | 
n-1  | 
n    | def bar

我仍然得到了n-1而不是正确的n-9,这不是一个大问题,但是得到n是一个很大的问题。

EN

回答 1

Stack Overflow用户

发布于 2012-12-05 06:04:45

由于您知道如何获取方法的第一行的编号,因此只需使用the number of lines the method's definition has即可。将前者与后者相加,就得到了最后一行的编号。

让我们改编链接问题中的示例来检查Set#add

代码语言:javascript
复制
require 'pry'
require 'set'
number_of_lines = Pry::Method.from_str("Set#add").source.lines.count

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13706462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档