Посмотрите, где символ определяется в IRB - PullRequest
5 голосов
/ 30 марта 2012

Я работаю над довольно большим проектом рельсов на работе. Иногда мне нужно выследить определения классов / констант. Есть ли какой-нибудь встроенный метод в Ruby, чтобы сделать это для меня? Пример:

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

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Это не совсем то, что вы ищете, но у методов do есть метод .source_location. Вы можете использовать это, чтобы узнать, где на самом деле реализован класс. (Поскольку ruby ​​позволяет открывать классы, это может быть в нескольких местах)

например, с учетом экземпляра объекта, i :

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

выдаст вам список всех файлов, в которых реализованы методы i .

Это будет работать для классов, в которых хотя бы один метод реализован в ruby. Однако для констант это не сработает.

0 голосов
/ 30 марта 2012

Если вы используете Ruby 1.9.2, ответ @ YenTheFirst правильный: вызовите #source_location для объекта метода.

Если вы используете Ruby 1.8.7, то #source_location не делает 'не существует (пока).Вам понадобится что-то вроде этой реализации метода.(Есть еще один или два, плавающие вокруг, но я не могу найти другой очень быстро).

0 голосов
/ 30 марта 2012

В самом начале перед загрузкой любого файла вставьте строку, которая определяет класс / константу, которую вы хотите проверить как нечто отличное от модуля. Например, предположим, у вас есть класс или другой вид константы 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_number будет местом, где определен A.

...