Различие между 'сам method_name' и 'класс <<сам' в Ruby

Я пытался ограничить инстанцирование класса только к единственному (не используя одиночный элемент), но я не мог. Я попробовал переменными класса (@@), но без удачи. Я погуглил его и столкнулся с этим:

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

Я искал 'класс <<сам' объяснение, надеющееся найти лучшее (или просто более простое и чистое), но против, никакая удача. Наконец, после некоторых тестов я пришел к заключению, что 'класс <<сам' является просто оберткой блока, где можно определить методы класса. Так, действительно ли это - корректное?

С уважением!

5
задан John Topley 8 January 2010 в 08:41
поделиться

3 ответа

Нотация 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/

35
ответ дан 18 December 2019 в 05:17
поделиться

Технически, вы определяете метод на метаклассе класса, а не на самом классе. Иегуда Кац имеет здесь отличное объяснение метакласов в Рубине: http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/

5
ответ дан 18 December 2019 в 05:17
поделиться

Ваш вывод верен. В основном, вы должны помнить, что даже классы являются объектами в рубине, и, следовательно, имеют экземпляры. А с помощью класса <<выражение себя вы просто изменяете экземпляр этого класса вашего объекта.

2
ответ дан 18 December 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: