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

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

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

3 ответа

NUMERIC

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

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

Fixnum

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

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

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

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,

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

Другие вопросы по тегам