Я пытался ограничить инстанцирование класса только к единственному (не используя одиночный элемент), но я не мог. Я попробовал переменными класса (@@), но без удачи. Я погуглил его и столкнулся с этим:
class A
@count = 0
class << self
attr_accessor :count
end
def initialize val
@a = val
self.class.count += 1
end
end
a=A.new 42
b=A.new 43
Я искал 'класс <<сам' объяснение, надеющееся найти лучшее (или просто более простое и чистое), но против, никакая удача. Наконец, после некоторых тестов я пришел к заключению, что 'класс <<сам' является просто оберткой блока, где можно определить методы класса. Так, действительно ли это - корректное?
С уважением!
Нотация class << self
открывает собственный класс объекта. Собственный класс - это анонимный класс, в котором хранится поведение, зависящее от экземпляра. В случае класса собственный класс иногда называют метаклассом.
Ruby использует собственные классы для реализации так называемых «методов класса» (также называемых статическими методами).
Класс (как заявил Мориц) также является объектом в Ruby, и поскольку он является объектом, он также имеет класс. Класс класса в Ruby называется 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 / секрет-жизнь-одиночек /
http://www.klankboomklang.com/2007/09/21/the-singleton-class/
Технически, вы определяете метод на метаклассе класса, а не на самом классе. Иегуда Кац имеет здесь отличное объяснение метакласов в Рубине: http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/
Ваш вывод верен. В основном, вы должны помнить, что даже классы являются объектами в рубине, и, следовательно, имеют экземпляры. А с помощью класса <<выражение себя вы просто изменяете экземпляр этого класса вашего объекта.