Рубиновое сумасшествие: класс против объекта?
я только начал играть с JRuby. Это мой первый рубиновый пост. Мне было трудно понять классы против объектов в Ruby. Это не означает, что классы и объекты в других объектно-ориентированных лагах. например
Class.is_a? Object
возвращает правда
и
Object.is_a? Object
слишком.
Итак, класс и объект - это оба объекта
еще один
Class.is_a? Class
возвращает правда
и
Object.is_a? Class
слишком.
подожди, я еще не закончил
Object.instance_of? Class
Class.instance_of? Class
верно
Object.instance_of? Object
Class.instance_of? Object
оба ложны. право, ничто не может быть экземпляром объекта.
и
Class.kind_of? Class
Object.kind_of? Class
верно
Class.kind_of? Object
Object.kind_of? Object
верно
так что оба точно такие же, тогда почему у нас есть оба эти.?
еще немного покопавшись, я написал это простой метод для возврата списка методов, поддерживаемых обоими
irb(main):054:0> def print_methods(obj)
irb(main):055:1> obj.methods.each do |mm|
irb(main):056:2* puts mm
irb(main):057:2> end
irb(main):058:1> end
только метод разница между print_methods (объект) и print_methods(класс) является
Nesting
если вложенность означает наследование, является ли объект похожим на запечатанный класс??
может кто-нибудь прояснить мне, что это все такое?
обновление: к комментарию Edds
интересно, что я вижу много различий в списке методов в
c=Class.new
print_methods(c)
&
o=Object.new
print_methods(o)
теперь я понимаю, что экземпляр класса действительно является экземпляром класса (и этот экземпляр класса на самом деле является объектом), а не экземпляром объекта. И даже этот экземпляр позволяет мне охватить другие экземпляры
xx = c.new //works - c is an Object / and xx is a instance of an Object c
yy = o.new //nope - o is already a instance of an Object, so it cannot be instantiated again
Итак, наконец, объект действительно является экземпляром класса. Потому что
xx.is_a? Class
ложно, но
xx.is_a? Object
возвращает true
я прав ??
7 ответов:
в основном, главное понять, что каждый класс является экземпляром
Classкласса и каждый класс является подклассомObject(в 1.8 - 1.9 в каждый класс является подклассомBasicObject). Так что каждый класс является объектом, в том смысле, что он является экземпляром подклассаObject, т. е.Class.конечно, это означает, что
Classявляется экземпляром самого себя. Если это причиняет боль вашему мозгу, просто не думайте об этом слишком глубоко.
ObjectиClassareis_a? Object
x.is_a? yвозвращаетtrueеслиx.class == y or x.class < y, т. е. ыyилиx'S класс наследует от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иyareinstance_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? Classtrue иString.instance_of? Objectложно по тем же причинам, что и выше. (ТакжеString.is_a? StringиString.instance_of? Stringоба ложны по тем же причинам - String-это класс, а не строка).из этого нельзя сделать вывод, что все классы быть одинаковым. Они просто все экземпляры одного класса.
сравнение методов
так как
ObjectиClassявляются классами, они оба имеют все методы экземпляра, определенныеClass.Classдополнительно имеет метод синглтонаnesting.nestingговорит вам, какой модуль вы в настоящее время вложены, это не имеет ничего общего с наследованием.для любого данного класса
TheClass.methodsвернет методы экземпляра, определенныеClass(напримерsuperclass, который возвращает класс, которыйTheClassнаследует, иnew, который создает новый экземплярTheClass) плюс одноэлементные методы, определенные этим классом.в любом случае
methodsтолько говорит вам, какие методы могут быть вызваны непосредственно на данном объекте. Он не говорит вам, какие методы могут быть вызваны на экземпляре класса. Для этого вы можете использоватьinstance_methods, который возвращает значительно отличающиеся результаты дляObjectиClass.
в Ruby все является
Objectвключая классы и модули.ObjectЭто самый низкоуровневый класс (ну и в Ruby 1.9.2 тоже естьBasicObjectно это уже другая история).см. следующие выходные данные.
> Object.ancestors # => [Object, Kernel, BasicObject] > Class.ancestors # => [Class, Module, Object, Kernel, BasicObject] > Module.ancestors # => [Module, Object, Kernel, BasicObject] > String.ancestors # => [String, Comparable, Object, Kernel, BasicObject]как видите, оба
ClassиModuleнаследует отObject.возвращаясь к вашим первоначальным утверждениям, вы должны понять разницу между
is_a?kind_of'instance_of?они не заменимы.
is_a?иkind_of?возвращает true, если other является тем же классом или предком. И наоборот,instance_of?возвращает true, только если other-это тот же класс.> Class.is_a? Object # => true > Class.kind_of? Object # => true > Class.instance_of? Object # => false
Рамеш, в Ruby все - это объект, и класс не является исключением.
попробуйте это в irb
ruby-1.9.2-p136 :001 > o = Object.new => #<Object:0x000001020114b0> ruby-1.9.2-p136 :002 > o.is_a? Class => false ruby-1.9.2-p136 :003 > o.is_a? Object => trueв этом случае я создал экземпляр объекта и проверил, является ли он классом (false) или объектом (true).
класс в ruby, это какой-то объект шаблона, используемый для создания экземпляров этого класса. Жаль, что это не очень понятно. Ключевая концепция заключается в том, что ruby-это чистый объектно-ориентированный язык, в отличие от Java.
иерархия классов/метаклассов всегда немного озадачивает :) просто для сравнения,вот один в Smalltalk; в Ruby настройка основана на тех же принципах, за исключением того, что она не имеет
BehaviorиClassDescriptionразличия, и есть модули и собственные классы, чтобы принять во внимание.полное объяснение объектной модели Smalltalk доступно в Фаро на примере, как указано этим вопрос.
Как _why пишет в этой статье
объекты не хранят методы, только классы могут.
в первых парах разделов есть несколько хороших моментов о классах и объектах
один из ответов говорит об этом:
в основном, главное понять, что каждый класс является экземпляр класса class и каждый класс является подклассом объекта. Поэтому каждый класс является объектом, в том смысле, что он является экземпляром подкласс объекта, т. е. класс.
Я просто хочу сказать это по-другому для тех, у кого есть небольшой поворот мозга. Сначала спросите себя: Что такое экземпляр в программировании? И что такое подкласс в Программирование? Экземпляр - это просто реализованный вариант схемы элементов (класса). Подкласс-это просто класс (схема элементов), который наследуется от другого класса (схема элементов). Поэтому при создании нового класса:
class Apple endApple является экземпляром класса, то есть это реализованный вариант чертежа. Он берет чертеж и заполняет детали (методы и переменные) своими собственными вариациями. Ну, чертеж наследуется от другого чертежа, который является объектом. Поэтому каждый класс экземпляр класса, который является подклассом объекта.
class A end A.parent => Object A.class => ClassПримечание класс имеет модуль в своей цепочке наследования (модуль включен в класс как mixin возможно, так как родитель класса является объектом?).
A.is_a?(Module) => trueэкземпляры (A. new) класса A будут иметь свои собственные реализованные варианты A. Но они являются экземплярами объектов. Поэтому мы должны различать экземпляры классов ( например, класс A end) и экземпляры объектов (A = A. new). Экземпляры объектов имеют другую цепочку наследования. Они реализованы изменения экземпляра класса копирку, не вариант класс.
Это означает, что в их цепочке наследования нет класса или модуля. Но скорее другие экземпляры объектов, поэтому, если A имеет экземпляры объектов, А B имеет экземпляры объектов и A наследует от B, Когда мы создаем новый экземпляр объекта A, Этот экземпляр будет иметь экземпляры B в своей цепочке наследования.
они также будут наследовать от Object, так как все в Ruby наследует от Объект.
a = A.new => #<A:0x007f966449b8d8> a.is_a?(Class) => false a.is_a?(Module) => false a.is_a?(Object) => trueи это лучший способ подумать обо всем этом. Не погружайтесь слишком глубоко в свои мысли. Примите это так, как я написал.
Comments