Посмотрите, где символ определяется в 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
не существует (пока). Вам понадобится что-то вроде этой реализации метода. (Есть еще один или два, плавающие вокруг, но я не могу найти другой очень быстро).