Посмотрите, где символ определяется в IRB

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам