Как Class может быть класса Class и не иметь методов экземпляра Class? - PullRequest
6 голосов
/ 25 сентября 2011

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

1 Ответ

3 голосов
/ 25 сентября 2011

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

В 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>
...