2012-03-30 11 views
5

私は仕事場でかなり大きなレールプロジェクトを担当しています。時には、クラス/定数の定義を捜す必要があります。私のためにRubyに組み込みのメソッドがありますか?例:任意のファイルの前に非常に冒頭でシンボルがirbで定義されている箇所を参照

irb> SOME_CONSTANT.__file__ 
=> /some/path/to/a/file 
+1

あなたのディレクトリに「SOME_CONSTANT =」のためのグロッピングだけを試みましたか? –

+0

.....................はい? –

答えて

1

これはあなたが探しているものではありませんが、のメソッドには.source_locationメソッドがあります。これを使用して、クラスが実際に実装されている場所を見つけることができます。 (ルビーはあなたがクラスを再度開くことができますので、これは複数の場所にすることができる)

例えば、オブジェクトのインスタンスを与えられ、

i.methods.map do |method_name| 
    method_obj = i.method(m) 
    file, line = method_obj.source_location 
    file #map down to the file name 
end.uniq 

はあなたにどこすべてのファイルのリストを与えますのメソッドが実装されています。

これは、少なくとも1つのメソッドがrubyで実装されているクラスで有効です。しかし、定数ではうまくいかないでしょう。

0

は、モジュール以外のものとして確認したいというクラス/定数を定義する行を挿入し、ロードされます。たとえば、コード内にクラスまたは他の種類の定数Aがあり、定義されている場所を知りたいとします。そして、メインファイルの先頭に、それは最初のクラスの定義を満たしている時はいつでもプログラムが実行された後

A = nil 

、/定数Aを書き、それが

some_path_to_a_file:line_number in `some_method': A is not a class (TypeError) 
のようなものが表示されます

又は

some_path_to_a_file:line_number: warning: already initialized constant A 

そして、some_path_to_a_file:line_numberAが定義されている場所です。

0

Ruby 1.9.2を使用している場合、@ YenTheFirstの答えは正しいです:Methodオブジェクトに#source_locationを呼び出してください。

Ruby 1.8.7を使用している場合、#source_locationは存在しません(まだ)。メソッドのthis implementationのようなものが必要です。 (もう1つまたは2つは浮かんでいますが、もう1つは本当に素早く見つかりません)。

+1

http://stackoverflow.com/a/13015691/260122によれば、 'method#source_location'をバックポートするgem [ruby18_source_location](https://github.com/ConradIrwin/ruby18_source_location)があります。 – clacke

関連する問題