У меня есть Соединение - в этом, размышляет над классом получателя, чтобы сгенерировать некоторый код. Это означает, что я должен выполнить метод класса в конце определения класса, как в этом тривиально 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
в конце определения класса?
Прежде всего, нет конца определению класса. Помните, что в 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
. Но определенно необходимость определять классы таким образом заставляет мои глаза болеть.