В чем разница между Integer и Fixnum?
Я знаю что Fixnum
класс наследует от Integer
учебный класс. Но какова реальная разница между ними? Есть ли случаи, когда мы иногда используем Fixnum
и иногда используют Integer
вместо?
2 ответа
Вы никогда не "используете" Integer
, Это абстрактный класс, работа которого состоит в том, чтобы наделять своих детей (Fixnum
а также Bignum
) с методами. Фактически, ни при каких обстоятельствах вы никогда не будете запрашивать класс объекта и вам скажут, что это Integer
,
ОБНОВЛЕНИЕ: Начиная с Ruby 2.4, Fixnum
а также Bignum
классы ушли, есть только Integer
, Точно такие же оптимизации все еще существуют, но они рассматриваются как "правильные" оптимизации компилятора, то есть за кулисами, невидимые для программиста.
Это несколько сбивает с толку. Integer
это реальный класс, о котором вы должны подумать. Fixnum
это в основном оптимизация производительности, которую программисту никогда не следовало делать видимой. (Сравните это с flonums в YARV, которые полностью реализованы как оптимизация внутри виртуальной машины и никогда не показываются программисту.)
В принципе, Fixnum
с быстрыми и Bignum
Это медленно (э), и реализация автоматически переключается между ними. Вы никогда не запрашиваете одно из них напрямую, вы просто получите одно или другое, в зависимости от того, соответствует ли ваше целое число ограниченному размеру Fixnum
или нет.