Запись class << self
открывает собственный класс объекта. Собственный класс - это анонимный класс, который хранит специфичное для экземпляра поведение. В случае класса собственный класс иногда называют метаклассом.
Ruby использует собственные классы для реализации так называемых «методов класса» (также называемых статическими методами).
Класс (как сказал Мориц) также является объектом в Ruby, и, поскольку он является объектом, он также имеет класс. Класс класса в Ruby называется Class
.
«Метод класса» в любом языке - это метод, в котором класс является получателем, то есть метод вызывается непосредственно для самого класса.
Однако, чтобы метод вызывался для получателя, этот метод должен быть определен в классе этого получателя. В случае классов «метод класса» может быть реализован как метод экземпляра класса Class
.
Но определение метода экземпляра на Class
будет означать, что ВСЕ классы получают доступ к этому методу класса, который не идеален.
Введите собственный класс, как указано выше, собственный класс для объекта - это специальный класс, в котором хранятся методы, уникальные для этого объекта. В случае классов подклассы собственного класса относятся к классу Class
и являются прямым классом класса.
«методы класса» в Ruby являются просто «методами экземпляра», определенными в собственном классе класса.
Запись def MyClass.my_method
фактически определяет my_method
для собственного класса MyClass. Если вы используете эту нотацию, вы можете обойтись (на некоторое время), фактически не понимая собственных классов, поскольку вы можете обмануть себя, думая, что это просто способ определения «статических методов» в Ruby, и продолжайте думать, что модель классов Ruby похожа на модель Java. Однако запись class << self
не допускает такой интерпретации, и вы должны смириться с реальностью собственных классов.
Таким образом, «методы класса» на самом деле являются «методами экземпляра», определенными в собственном классе, а class << self
предоставляет вам доступ к собственному классу.
Для получения дополнительной информации ознакомьтесь со следующими ссылками:
http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/
http://banisterfiend.wordpress.com/2008/10/25/the-secret-life-of-singletons/
http://www.klankboomklang.com/2007/09/21/the-singleton-class/