1

パーサー (Ruby 実装自体で実行されているもの以外) または正規表現またはそれを行う外部ライブラリを使用してソース コードを解析せずに、メソッド定義の最後の行の場所を知る方法はありますか?

set_trace_funcまたはによって提供される情報を使用してメソッド定義の最初の行を取得するのは簡単です。method_addedこれらはメソッド定義の時点でトリガーされるためです。また、提供された情報を (から直接set_trace_funcまたはからのcaller情報を解析してmethod_added) 分析できます。

しかし、メソッド定義の最後の行については、次のメソッド定義の最初の行またはcallによって検出された他の sを探すことが最善の方法set_trace_funcです。元のメソッド定義がこの行で終了したことはわかりますが、それより前の行で終了したかどうかはわかりません。たとえば、 method の定義の最後の行を取得しようとしているとしますfoo。ソースコードが以下のような場合:

   | def foo
   |   ...
n  | end; def bar
   |   ...

bar定義の最初の行が であるとするとn、(偶然にも)foo定義の最後の行は であることがわかりますn。しかし、ソースコードがたまたま以下のようなものだった場合:

     | def foo
     |   ...
n-1  | end
n    | def bar

n-1次に、 の最後の行として取得したいのですが、この場合であり、fooではないことを伝える方法がわかりません。ソースコードには、次のような空の行またはコメント行がさらに含まれる場合があります。n-1n

     | 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 に答える