2012-12-04 40 views
1

有沒有一種方法可以知道方法定義的最後一行的位置,而無需使用解析器(除了在Ruby實現本身下運行的解析器)或正則表達式解析源代碼或任何外部庫,這樣做?獲取方法定義的最後一行

這是很容易通過使用set_trace_funcmethod_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-1foo最後一行,我不能想出一個辦法來告訴它是在這種情況下n-1而不是n 。源代碼還可以具有空/註釋行是這樣的:

 | def foo 
    | ... 
n-9 | end 
    | 
    | # comment 
    | 
    | =begin 
    | ... 
    | =end 
    | 
n-1 | 
n | def bar 

,這是不是一個大問題,我仍然得到n-1而不是正確的n-9,但越來越n反而是一個大問題。

+0

你想達到什麼目的? Ruby的解釋器中可能存在更深入的魔法,你可以利用它來獲取這些信息。 –

+0

@theTinMan我在Ruby中編寫了一個軟件,它讀取一個Ruby文件並生成一個html文件,該文件可以更輕鬆地瀏覽代碼。對於每個方法定義和常量賦值,它顯示從源提取的信息,例如參數列表(對於方法)或值(對於常量)以及對應的源代碼部分。我正在尋找一個強大的和非冗餘的方式。如果你能顯示任何方向,這將會有所幫助。 – sawa

回答

1

既然您知道如何獲取某個方法的第一行的編號,您所需要的只是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指出,撬使用Ruby的內置解析器提取源代碼。

+0

你如何得到行數? – sawa

+0

不撬使用正則表達式來解析源代碼? – sawa

+0

我以爲是的。請閱讀我的問題。 – sawa