Выполнение метода mixin в конце определения класса - PullRequest
1 голос
/ 04 июля 2010

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

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 Ответ

2 голосов
/ 04 июля 2010

Прежде всего, нет определения конца класса. Помните, что в 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

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

...