#ruby
#ruby
Вопрос:
Я хочу найти методы экземпляра, определенные внутри класса (явно с помощью def
, а не те, которые являются производными от других вызовов, таких как attr_accessor
)
Чтобы сделать это, я подумал о том, чтобы зациклить instance_methods(false)
результат и проверить, совпадает ли местоположение каждого метода source_location
с местоположением исходного кода класса.
Как я могу найти местоположение исходного кода класса?
Комментарии:
1. Расположение исходного кода для
attr_accessor
методов указывает на строку, гдеattr_accessor
был вызван, т. е. обычно оно не отличается от явно определенных методов.2. @Stefan Да, но из
attr_accessor :foo
производный методfoo=
не будет иметь расположение исходного кода класса. Это то, что я имел в виду под «явно», возможно, мне придется перефразировать эту часть.3.
foo=
имеет такое же расположение исходного кода, еслиattr_accessor :foo
он был вызван изнутри класса.4. @Stefan верно, что
5. Кстати, зачем вам эти методы? Может быть, есть другой способ.
Ответ №1:
[на самом деле это не ответ на вашу проблему, но слишком длинный для комментария]
source_location
похоже, здесь это не помогает, потому что динамические методы могут быть созданы с произвольным расположением:
# my_class.rb
class MyClass
attr_accessor :foo
class_eval(<<-RUBY, __FILE__, __LINE__ 1)
def bar
end
RUBY
class_eval(<<-RUBY, 'dummy.rb', 42)
def baz
end
RUBY
end
p MyClass.instance_method(:foo).source_location
p MyClass.instance_method(:bar).source_location
p MyClass.instance_method(:baz).source_location
Вывод:
$ ruby my_class.rb
["my_class.rb", 4]
["my_class.rb", 7]
["dummy.rb", 42]
Комментарии:
1. ПОКА о том, что вы сделали с произвольными местоположениями!
2. Эти произвольные расположения полезны, когда вы пишете что-то, что преобразует код в Ruby, который затем выполняется, что, среди прочего, делают ERB и HAML . Таким образом, может показаться, что ошибка возникла в исходном файле, а не в каком-то случайном фрагменте промежуточного кода.