В чем разница между 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
,