Определение типа объекта в ruby

Я буду использовать python в качестве примера того, что я ищу (вы можете думать об этом как о псевдокоде, если вы не знаете Python):

>>> a = 1
>>> type(a)
<type 'int'>

Я знаю, что в Ruby я могу сделать :

1.9.3p194 :002 > 1.class
 => Fixnum 

но является ли это правильным способом определения типа объекта?

4 ответов


правильный способ определить" тип " объекта, который является шатким термином в мире Ruby, - это вызвать object.class.

поскольку классы могут наследовать от других классов, если вы хотите определить, является ли объект "определенного типа", вы можете вызвать object.is_a?(ClassName) чтобы увидеть, если object типа ClassName или производные от него.

обычно проверка типа не выполняется в Ruby, но вместо этого объекты оцениваются на основе их способности реагировать на определенные методы, обычно называется"утиной типизацией". Другими словами, если он отвечает на методы, которые вы хотите, нет причин быть особенным в отношении типа.

например, object.is_a?(String) слишком жесткий, так как другой класс может реализовать методы, которые преобразуют его в строку, или заставить его вести себя идентично тому, как ведет себя строка. object.respond_to?(:to_s) было бы лучшим способом, чтобы проверить, что объект делает то, что вы хотите.


вы также можете попробовать:instance_of?

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True

часто в Ruby вам на самом деле все равно, какой класс объекта, как таковой, вам просто важно, что он реагирует на определенный метод. Это известно как Утиной Типизацией и вы увидите его во всех видах Ruby кодовых баз.

Так что во многих (если не в большинстве) случаев лучше всего использовать утку, используя #respond_to?(method):

object.respond_to?(:to_i)

Я бы сказал "Да". Как сказал "МАЦ" что-то подобное в одной из своих бесед, - У объектов Ruby нет типов." Не все, но часть, которую он пытается донести до нас. Почему кто-то сказал Значит, "все есть объект"? Чтобы добавить, он сказал: "данные имеют типы, а не объекты".

Так что мы могли бы наслаждаться этим.

https://www.youtube.com/watch?v=1l3U1X3z0CE

но Ruby не заботится о типе объекта только класс. Мы используем классы, а не типы. Все данные затем имеют класс.

12345.class

'my string'.class

у них также могут быть предки

Object.ancestors

у них также есть мета-классы, но я сохраню вам подробности об этом.

Как только вы узнаете класс, вы сможете найти, какие методы вы можете использовать для него. Вот где необходим "тип данных". Если вы действительно хотите вдаваться в детали, посмотрите вверх...

"Объектная Модель Ruby"

Это термин, используемый для как Ruby обрабатывает объекты. Это все внутреннее, поэтому вы не видите многого из этого, но приятно знать. Но это уже другая тема.

да! Класс-это тип данных. Объекты имеют классы, а данные-типы. Поэтому, если вы знаете о базах данных, вы знаете, что существует только конечный набор типов.

текстовые блоки числа