Расположение исходного кода класса

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