Чтобы уточнить и исправить то, что я написал в комментариях относительно того, как Ruby скрывает / выставляет собственные классы, вот ситуация:
Ruby 1.8:
(1) Метод Object#class
всегда возвращает первый реальный (не собственный класс или класс iClass) суперкласса фактического класса объекта.
например,
o = Object.new
class << o; end
o.class #=> returns Object, even though the _actual_ class is the eigenclass of o
Другими словами, метод Object#class
никогда не будет возвращать собственный класс, он проходит над ними
и вместо этого возвращает первый «реальный» класс, который он находит в иерархии наследования.
(2) Метод Class#superclass
имеет два случая. Если получатель не является собственным классом, он просто возвращает суперкласс. Однако, если получатель является собственным классом, тогда этот метод возвращает фактический (т.е. не обязательно действительный) класс получателя.
# case where receiver is a normal class (i.e not an eigenclass)
Module.superclass #=> Object (behaves as expected)
# case where receiver is an eigenclass
class << Module; superclass; end #=> returns Class, this is NOT the superclass
Сверху, Class#superclass
ведет себя как и ожидалось в случае нормального класса, но для примера с собственным классом в нем говорится, что суперклассом собственного класса модуля является класс, который не соответствует действительности. Из этой диаграммы http://banisterfiend.wordpress.com/2008/10/25/the-secret-life-of-singletons/ мы знаем, что суперкласс собственного класса модуля на самом деле является собственным классом объекта. Я не уверен, почему в Ruby 1.8 такое странное поведение.
Ruby 1.9:
(1) Метод Object#class
ведет себя идентично версии 1.8.
(2) У метода Class#superclass
больше нет двух случаев, теперь он обрабатывает собственные классы так же, как он обрабатывает обычные классы и возвращает фактический суперкласс, как и ожидалось.
1035 * например *
class << Module; superclass; end #=> #<Class:Object>