Как объекты могут иметь методы класса в ruby? - PullRequest
0 голосов
/ 01 сентября 2011

Объект, Класс, Модуль, NilClass являются экземплярами класса.

1) Первое сомнение, как что-то может быть экземпляром самого себя? (i.e 'Class' is an instance of 'Class') или моё предположение неверно?

2) Если Object, Class, Module и т. Д ... являются объектами, то как они могут иметь методы класса? Потому что методы класса могут быть вызваны только из классов и не присутствуют в объектах. (or is my assertion incorrect that Object, Class , Module are all objects ?)

3) Если Объект, Класс, Модуль не являются объектами, то чем они являются?

3) Учитывает ли метод класса отсутствующий метод в экземпляре a из Class и, в конечном итоге, уменьшение количества методов?

>> Class.methods.count

=> 82

>> a = Class.new

=> #<Class:0x1005519b8>

>> a.methods.count

=> 81

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Объекты класса действительно являются объектами.

Методы класса на самом деле являются методами, определенными в собственном классе класса (одноэлементном классе).Вот почему эти методы недоступны для реальных экземпляров указанных классов.

Вот способ помочь вам увидеть это: во-первых, добавьте метод singleton_class, если у вас его еще нет:

module Kernel
  def singleton_class
    class << self
      self
    end
  end
end

Теперь попробуйте следующее:

String.instance_methods
String.singleton_class.instance_methods
Class.instance_methods
Class.singleton_class.instance_methods
c = Class.new
c.instance_methods
c.singleton_class.instance_methods

Это поможет вам оценить, какие методы доступны для экземпляров класса по сравнению с методами, которые являются методамив классе (т. е. экземпляры одноэлементного класса).

(Вы можете передать аргумент false каждому из этих вызовов instance_methods, чтобы увидеть, какие методы определены для этого класса, а не какие-либосуперкласс.)

0 голосов
/ 01 сентября 2011
  1. Ядро Ruby состоит из Class, Object, Module и Kernel. Они предопределены, поэтому класс Class может быть его экземпляром.

  2. У них есть методы класса, потому что они тоже классы (а классы являются объектами).

  3. Я пока не могу ответить. Я должен выяснить, какой метод отсутствует, чтобы думать в ответе.

...