Выполнение метода смешивания в конце определения класса

У меня есть Соединение - в этом, размышляет над классом получателя, чтобы сгенерировать некоторый код. Это означает, что я должен выполнить метод класса в конце определения класса, как в этом тривиально dumbed вниз пример:

module PrintMethods
  module ClassMethods
    def print_methods
      puts instance_methods
    end
  end

  def self.included(receiver)
    receiver.extend ClassMethods
  end
end

class Tester
  include PrintMethods

  def method_that_needs_to_print
  end

  print_methods
end

Я хотел бы иметь смешивание, делают это для меня автоматически, но я не могу придумать путь. Моя первая мысль состояла в том, чтобы добавить receiver.print_methods кому: self.included в смешивании, но это не будет работать, потому что метод, над которым я хочу, чтобы оно размышляло, еще не был объявлен. Я мог звонить include PrintMethods в конце класса, но это чувствует себя подобно невоспитанности.

Есть ли любые приемы, чтобы заставить это произойти так, я не должен звонить print_methods в конце определения класса?

1
задан Brian Genisio 4 July 2010 в 17:09
поделиться

1 ответ

Прежде всего, нет конца определению класса. Помните, что в Ruby вы можете повторно открыть метод класса Tester после его «инициализации», поэтому интерпретатор не может знать, где «заканчивается» класс.

Решение, которое я могу придумать, - создать класс с помощью некоторого вспомогательного метода, например

module PrintMethods
  module ClassMethods
    def print_methods
      puts instance_methods
    end
  end

  def self.included(receiver)
    receiver.extend ClassMethods
  end
end

class Object
  def create_class_and_print(&block)
    klass = Class.new(&block)
    klass.send :include, PrintMethods
    klass.print_methods
    klass
  end
end

Tester = create_class_and_print do
  def method_that_needs_to_print
  end
end

. Но определенно необходимость определять классы таким образом заставляет мои глаза болеть.

2
ответ дан 2 September 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: