В чем разница между Fixnum и Numeric

Они кажутся эквивалентными, но при их сравнении это неверно:

5.is_a? Fixnum
# => true
5.is_a? Numeric
# => true
Numeric == Fixnum
# => false

person GMarx    schedule 22.02.2016    source источник
comment
Numeric — это базовый класс для всех классов чисел, таких как Fixnum, Float или Rational. Найдите иерархию числовых классов ruby, чтобы получить обзор.   -  person sschmeck    schedule 22.02.2016
comment
ах, спасибо! Просмотрев это, согласитесь ли вы со следующим: все, что является Fixnum, является экземпляром класса Numeric, но не все, что является Numeric, является Fixnum.   -  person GMarx    schedule 22.02.2016
comment
@GMarx точно, это Fixnum < Integer < Numeric < Object. Вы также можете заключить, что каждое целое число является объектом, но не каждый объект является целым числом — совершенно очевидно, не так ли?   -  person Stefan    schedule 22.02.2016
comment
Отлично, спасибо @Stefan   -  person GMarx    schedule 25.02.2016


Ответы (3)


ЦИФРОВОЙ

Numeric — это класс, от которого должны наследоваться все числовые классы более высокого уровня.

Numeric позволяет создавать экземпляры объектов, размещенных в куче. Другие основные числовые классы, такие как Integer, реализованы как непосредственные объекты, что означает, что каждый Integer представляет собой один неизменяемый объект, который всегда передается по значению.

ФИКС НОМЕР

Fixnum содержит целые значения, которые могут быть представлены в собственном машинном слове (минус 1 бит). Если какая-либо операция над Fixnum превышает этот диапазон, значение автоматически преобразуется в Bignum.

Объекты Fixnum имеют непосредственное значение. Это означает, что когда они назначаются или передаются в качестве параметров, передается фактический объект, а не ссылка на этот объект.

ПРИМЕЧАНИЕ. Каждый Fixnum является числовым, но каждый Numeric не является Fixnum.

ОБНОВЛЕНИЕ: Ruby 2.4 объединяет fixnum и bignum в целое число.

person techdreams    schedule 22.02.2016

Numeric == Fixnum возвращает false, потому что это разные классы.

is_a? не проверяет конкретный класс объекта, это будет instance_of?. Это документация для is_a?:

Возвращает true, если class является классом obj или если class является одним из суперклассов obj или модулей, включенных в obj.

Как упоминалось в другом ответе, Fixnum является подклассом Numeric, поэтому 5.is_a? Fixnum и 5.is_a? Numeric возвращают true.

person p4sh4    schedule 22.02.2016

is_a? не то же самое, что instance_of?, это то же самое, что kind_of?. Таким образом, ваши первые две строки не показывают, что Fixnum и Numeric одинаковы. Третья строка показывает, что они разные. На самом деле Fixnum является подклассом Numeric.

person sawa    schedule 22.02.2016