Я изучал, как реализован интерпретатор Ruby, и возник вопрос, который еще не получил ответа для меня. Вот в названии: Class
(r_cClass
) имеет super
, установленный для себя (игнорируя метаклассы, так как фактически super
- это метакласс r_cClass
), если я отправлю один метод объекту Class
, это будет рассмотрено в таблице методов Class
'класс. Но Class
'класс Class
, так что не должен ли я искать методы экземпляра Class
? Но это не так, поскольку в документации методы класса Class
и методы Class
выделены. В search_method
в eval.c
Ruby я не нашел специальной проверки для класса Class
. Может кто-нибудь пролить некоторый свет на это?Как класс может быть класса класса и не иметь методов экземпляра класса?
ответ
Ваши убеждения о том, как это работает, кажутся правильными, но я не уверен, почему вы думаете, что это не так.
В Ruby 1.8.7:
irb> a = Class.new.methods - Object.new.methods
=> [... 36 element array ...]
irb> b = Class.methods - Object.new.methods
=> [... 37 element array ...]
irb> b - a
=> ["nesting"]
Нормальный экземпляр класса (Class.new) имеет 36 методов экземпляра. Если я посмотрю на сам класс, который также является обычным экземпляром класса, он имеет те же 36 методов экземпляра, плюс 1 дополнительный метод класса (вложенность), который существует только потому, что он унаследован от своего суперклассного модуля.
Обратите внимание, что добавление метода экземпляра в класс автоматически добавляет его как метод класса, но добавление класса в метакласс класса не будет.
irb> class Class ; def everywhere ; true ; end ; end
irb> class << Class ; def only_singleton ; true ; end ; end
irb> Class.everywhere
=> true
irb> Class.new.everywhere
=> true
irb> Class.only_singleton
=> true
irb> Class.new.only_singleton
NoMethodError: undefined method 'only_in_singleton' for #<Class:0x4800ac8>
Итак, методы на самом деле одинаковы. На самом деле в исходном коде нет подсказки, которая привела меня к этой мысли. Это просто, что документы Ruby четко разделяют метод экземпляра класса из методов Singleton класса. Это разделение сделано только для ясности? – eugeniodepalo
По методам singleton вы имеете в виду методы класса? – rdvdijk
Да, я имею в виду методы класса. – eugeniodepalo
В абстрактном виде это, вероятно, хорошая идея дать конкретные примеры, такие как пример одного метода экземпляра и пример одного метода класса. –