Я также хотел бы объяснить механизм, как он работает. Если я не прав, пожалуйста, исправьте.
Когда мы используем include
, мы добавляем связь из нашего класса в модуль, содержащий несколько методов.
class A
include MyMOd
end
a = A.new
a.some_method
У объектов нет методов, есть только предложения и модули.
Поэтому, когда a
получает сообщение some_method
, он начинает метод поиска some_method
в собственном классе a
, затем в классе A
, а затем в связанных с модулями класса A
, если они есть (в обратном порядке). , последние включены победы).
Когда мы используем extend
, мы добавляем связь с модулем в собственном классе объекта.
Поэтому, если мы используем A.new.extend (MyMod), мы добавляем связь с нашим модулем к собственному классу экземпляра A или a'
классу.
И если мы используем A.extend (MyMod), мы добавляем связь с A (объекты, классы также являются объектами) eigenclass A'
.
поэтому путь поиска метода для a
выглядит следующим образом:
a => a '=> связанные модули с a' class => A.
также есть метод prepend, который изменяет путь поиска:
a => a '=> добавленные модули к A => A => включенному модулю к A
извините за мой плохой английский.