2014-01-27 32 views

回答

33

你从不“使用”Integer。这是一个抽象类,其工作是赋予子女(FixnumBignum)方法。实际上,在任何情况下,你都不会要求一个对象的课程,并被告知它是一个Integer

+5

此答案对Ruby 2.3及更早版本是正确的。从Ruby 2.4开始是错误的。查看其他[回答](https://stackoverflow.com/questions/21372649/what-is-the-difference-between-integer-and-fixnum/21411269#21411269)。 –

+0

@EricDuminil非常好,谢谢你的好评。 – matt

48

UPDATE:随着Ruby 2.4的FixnumBignum类都不见了,只有Integer。仍然存在完全相同的优化,但它们被视为“正确的”编译器优化,即在幕后,程序员不可见。


这有点令人困惑。 Integer是你应该考虑的类realFixnum基本上是一个性能优化,首先应该永远不会让程序员看到它。 (在YARV flonums,这是完全实现为VM内的优化,绝不会暴露给程序员比较一下。)

基本上Fixnum s为快速Bignum s为慢(ER),并实施自动在它们之间来回切换。你从不直接要求其中一个,你只需要获得一个或另一个,具体取决于你的整数是否适合Fixnum的受限制的大小。

+4

所以如果你想实现像'3.to_roman'这样的东西,你应该扩展'Integer'而不是'Fixnum'吧? – Dennis

+2

这样做会使'to_roman'对'Fixnum'和'Bignum'都可用。如果这是你的目标,那么是的。 –