По сути, главное, что нужно понять, это то, что каждый класс является экземпляром класса Class
, а каждый класс является подклассом Object
(в 1.8 - в 1.9 каждый класс является подклассом BasicObject
). Таким образом, каждый класс является объектом в том смысле, что он является экземпляром подкласса Object
, т.е. Class
.
Конечно, это означает, что Class
является экземпляром самого себя. Если это причиняет боль вашему мозгу, просто не думайте об этом слишком глубоко.
Object
и Class
являются is_a? Object
x.is_a? y
возвращает true
, если x.class == y or x.class < y
, т. Е. Если класс x
равен y
, или класс x
наследуется от y
. Поскольку каждый класс наследует от объекта, x.is_a? Object
возвращает true независимо от того, что x
. (В любом случае в 1.8 в 1.9 есть также BasicObject
, который сейчас является самым базовым классом в иерархии наследования).
Они также is_a? Class
И Object
, и Class
действительно являются классами, так что это не должно удивлять.
Они также instance_of? Class
, но не instance_of? Object
.
В отличие от is_a?
, x.instance_of? y
возвращает true только если x.class == y
, а не если x.class
является подклассом y
. Так как x
и y
являются instance_of? Class
, они не instance_of? Object
.
верно, ничто не может быть экземпляром объекта.
Это не правда. Object.new.instance_of? Object
верно.
kind_of
kind_of?
- псевдоним для is_a?
, см. Выше.
Так что оба абсолютно одинаковы, тогда зачем нам оба эти ??
Следует отметить, что до сих пор все верно для всех классов. Например. String.is_a? Object
, String.is_a? Class
и String.instance_of? Class
имеют значение true, а String.instance_of? Object
- false по тем же причинам, что и выше. (Также String.is_a? String
и String.instance_of? String
оба имеют значение false по одним и тем же причинам - String - это класс, а не строка).
Из этого нельзя сделать вывод, что все классы одинаковы. Это просто экземпляры одного класса.
Сравнение методов
Поскольку Object
и Class
являются классами, они оба имеют все методы экземпляра, определенные Class
. Class
дополнительно имеет метод синглтона nesting
. nesting
сообщает вам, в каком модуле вы сейчас находитесь, он не имеет ничего общего с наследованием.
Для любого данного класса TheClass.methods
вернет методы экземпляра, определенные Class
(например, superclass
, который возвращает класс, от которого наследуется TheClass
, и new
, который создает новый экземпляр TheClass
) плюс одноэлементные методы, определенные этим классом.
В любом случае methods
только сообщает вам, какие методы могут быть вызваны непосредственно для данного объекта. Он не говорит вам, какие методы могут быть вызваны для экземпляра класса. Для этого вы можете использовать instance_methods
, который возвращает существенно отличающиеся результаты для Object
и Class
.