2011-09-25 5 views
6

Я изучал, как реализован интерпретатор Ruby, и возник вопрос, который еще не получил ответа для меня. Вот в названии: Class (r_cClass) имеет super, установленный для себя (игнорируя метаклассы, так как фактически super - это метакласс r_cClass), если я отправлю один метод объекту Class, это будет рассмотрено в таблице методов Class 'класс. Но Class 'класс Class, так что не должен ли я искать методы экземпляра Class? Но это не так, поскольку в документации методы класса Class и методы Class выделены. В search_method в eval.c Ruby я не нашел специальной проверки для класса Class. Может кто-нибудь пролить некоторый свет на это?Как класс может быть класса класса и не иметь методов экземпляра класса?

+0

В абстрактном виде это, вероятно, хорошая идея дать конкретные примеры, такие как пример одного метода экземпляра и пример одного метода класса. –

ответ

3

Ваши убеждения о том, как это работает, кажутся правильными, но я не уверен, почему вы думаете, что это не так.

В 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> 
+0

Итак, методы на самом деле одинаковы. На самом деле в исходном коде нет подсказки, которая привела меня к этой мысли. Это просто, что документы Ruby четко разделяют метод экземпляра класса из методов Singleton класса. Это разделение сделано только для ясности? – eugeniodepalo

+0

По методам singleton вы имеете в виду методы класса? – rdvdijk

+0

Да, я имею в виду методы класса. – eugeniodepalo

 Смежные вопросы

  • Нет связанных вопросов^_^