Integer和Fixnum有什么区别?

Kit*_* Ho 60 ruby

我知道Fixnum该类继承自Integer该类.但它们之间的实际区别是什么?是否有任何用例我们有时使用Fixnum,有时使用Integer

Jör*_*tag 67

更新:从Ruby 2.4开始,类FixnumBignum类都消失了,只有Integer.完全相同的优化仍然存在,但它们被视为"适当的"编译器优化,即在幕后,对程序员来说是不可见的.


这有点令人困惑.Integer是你应该考虑的真正的课程.Fixnum基本上是一个性能优化,首先应该永远不会让程序员看到它.(将其与YARV中的flonum进行比较,它们完全作为VM内部的优化实现,并且从未向程序员公开过.)

基本上,Fixnums很快而且Bignums很慢(呃),并且实现自动在它们之间来回切换.你永远不会直接要求其中一个,你会得到一个或另一个,这取决于你的整数是否符合a的限制大小Fixnum.

  • 所以如果你想实现类似`3.to_roman`的东西,你应该扩展`Integer`而不是`Fixnum`吧? (5认同)
  • 这样做会使`to_roman`可用于'Fixnum`和`Bignum`.如果这是你的目标,那么是的. (3认同)

mat*_*att 41

你永远不会"使用" Integer.它是一个抽象类,其工作是赋予其子(FixnumBignum)方法.实际上在任何情况下你都不会要求一个对象的类,并被告知它是一个Integer.

  • 这个答案对于Ruby 2.3和旧版本是正确的.从Ruby 2.4开始是错误的.请参阅其他[答案](/sf/ask/1496085461/#21411269). (10认同)