Я ссылаюсь к follwing статье paragaph «Pitfall # 1»: http://definingterms.com/2013/03/23/pitfalls-of-ruby-mixins/Понимание механизма прокси-класс в рубин подмешать в
У меня есть следующие настройки, немного изменила форму, используемую в статье:
module EmailReporter
def send_report
#Sending a report ...
puts self.class
end
end
class Person
end
class Employee < Person
include EmailReporter
end
Как я понимаю, когда я включаю EmailReporter в Employee, его методы не только вставить в него, но анонимный прокси-класс создан и введен в цепочке наследования выше Работника и под Person.
Когда я вызываю Employee.new.send_report, я не входит в сферу деятельности Employee, а входит в сферу действия прокси-класса. Таким образом, у меня не было бы доступа к константам или переменным класса Employee, но у меня был бы доступ к переменным экземпляра.
Вопросы:
Если я бегу Employee.new.send_report, выход "Сотрудник", а не что-то вроде "Employee__proxy_class". Почему это? Не следует ли «я» ссылаться на класс прокси?
В статье предлагается, чтобы метод делегатов класса прокси-сервера вызывал модуль EmailReport. Но, конечно, вы не можете просто вызвать методы экземпляра на нем. Итак, кому доверяет класс прокси-сервера?
Спасибо всем, кто пытается ответить на мой вопрос!
само относится к приемнику, поэтому многие из методов в рубине работают. Возьмем, например, метод '# send'. '# send' определяется в' Object', но вы не хотите, чтобы 'Employee.send' выполнялся в контексте самого объекта и терял контекст' Employee'. включенные модули, в то время как они могут быть «классом включения», в сущности, вводят свои методы в класс, в который они были включены. Причина, по которой это делается на более высоком уровне, - это позволить вам переписать методы в самом классе. Все методы делегируются цепочкой наследования, если только 'method_missing' прерывает это. – engineersmnky
А, спасибо. Что касается себя, конечно, вы правы, и я не знаю, почему я этого не понял. Значит, это означает графику в статье (http://definingterms.com/images/posts/mixins_d3.jpg), а также класс класса proxy вводит в заблуждение, потому что прокси-класс выше Employee не делегирует никому другому классу, но содержит сами методы. – thedudedude
Я бы сказал, что это немного вводит в заблуждение. Я думаю, что причина, по которой он ссылался на это как прокси-сервер, заключается в том, что он может быть включен в любом месте, не соответствует единственному принципу наследования и разрывает инкапсуляцию. – engineersmnky