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

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

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

Я знаю в рубине, я могу сделать:

1.9.3p194 :002 > 1.class
 => Fixnum 

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Часто в Ruby вы фактически не заботитесь о том, какой класс объекта, по сути, вам просто нужно, чтобы он отвечал на определенный метод. Это называется Duck Typing, и вы увидите его во всех видах кодов Ruby.

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

object.respond_to?(:to_i)

Ответ 4

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

Итак, мы можем наслаждаться этим.

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

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

12345.class

'my string'.class

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

Object.ancestors

У них также есть мета-классы, но я сохраню вам информацию об этом.

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

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

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

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

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