Я буду использовать Python в качестве примера того, что я ищу (вы можете думать о нем как о псевдокоде, если вы не знаете Python):
>>> a = 1
>>> type(a)
<type 'int'>
Я знаю, в рубине я могу сделать:
1.9.3p194 :002 > 1.class
=> Fixnum
Но так ли это правильно для определения типа объекта?
isinstance
или проверить ответы. Но просто сказать "НЕТ !!!" не очень полезно, правда? Вместо этого подумайте о том, чтобы быть образовательным.Ответы:
Правильный способ определения «типа» объекта, который является шатким термином в мире Ruby, - это вызов
object.class
.Так как классы могут наследоваться от других классов, если вы хотите определить, принадлежит ли объект «к определенному типу», вы можете позвонить,
object.is_a?(ClassName)
чтобы узнать, имеет лиobject
он типClassName
или является его производным.Обычно проверка типов не выполняется в Ruby, но вместо этого объекты оцениваются на основании их способности реагировать на конкретные методы, обычно называемые « типизацией утки ». Другими словами, если он отвечает на методы, которые вы хотите, нет никаких оснований для конкретного типа.
Например,
object.is_a?(String)
он слишком жесткий, поскольку другой класс может реализовывать методы, которые преобразуют его в строку или заставляют вести себя идентично поведению String.object.respond_to?(:to_s)
было бы лучшим способом проверить, что рассматриваемый объект делает то, что вы хотите.источник
#class
ничего не возвращает тип объекта, он возвращает его класс . Имя должно быть мертвой раздачей. Класс и Тип - это две совершенно разные концепции в ОО.typeof
C, JavaScript и другимclass
. В Ruby нет официальной системы протоколов, как в других языках, Objective-C является ближайшим родственником Smalltalk с этим. Если вы определяете «тип» как «объект, который отвечает на определенный набор методов с приемлемыми результатами», то на самом деле нет никакого способа утверждать это. Это просто слишком свободно. В большинстве случаев в Ruby при ссылке на тип объекта понимается, что вы говорите о классе. Я использовал термин «тип» в кавычках именно по этой причине.int i
» или «Integer j
».) Тадман ответил на вопрос таким образом , что , казалось, удовлетворить и вопрошающего и общая аудитория, разъясняя терминологию, которую использует Ruby. Я не заинтересован в том, чтобы разбираться в академических прическах по тонкостям объектно-ориентированной терминологии, поэтому, пожалуйста, скажи последнее слово.Вы также можете попробовать:
instance_of?
источник
Часто в Ruby вас не волнует, какой класс у объекта, по сути, вы просто заботитесь о том, чтобы он реагировал на определенный метод. Это известно как Duck Typing, и вы увидите это во всех видах кодовых баз Ruby.
Так что во многих (если не в большинстве) случаях лучше всего использовать Duck Typing, используя
#respond_to?(method)
:источник
Я бы сказал "Да". Как сказал «Матц» нечто подобное в одном из своих выступлений, «у объектов Ruby нет типов». Не все это, а та часть, которую он пытается донести до нас. Почему тогда кто-то сказал: «Все есть объект»? Чтобы добавить, он сказал: «Данные имеют типы, а не объекты».
Таким образом, мы могли бы наслаждаться этим.
https://www.youtube.com/watch?v=1l3U1X3z0CE
Но Руби не волнует тип объекта, а только класс. Мы используем классы, а не типы. Все данные затем имеют класс.
Они также могут иметь предков
У них также есть мета-классы, но я сохраню вам детали об этом.
Как только вы узнаете класс, вы сможете посмотреть, какие методы вы можете использовать для него. Вот где нужен «тип данных». Если вы действительно хотите вникнуть в подробности, посмотрите вверх ...
"Рубиновая объектная модель"
Этот термин используется для обозначения того, как Ruby обрабатывает объекты. Это все внутреннее, так что вы не особо видите это, но приятно знать. Но это другая тема.
Да! Класс является типом данных. У объектов есть классы, а у данных есть типы. Так что если вы знаете о базах данных, то знаете, что существует только конечный набор типов.
номера текстовых блоков
источник
Object.ancestors # => [Object, Kernel, BasicObject]