【问题标题】:What is the difference between Integer and Fixnum?Integer 和 Fixnum 有什么区别?
【发布时间】:2014-01-27 03:40:29
【问题描述】:

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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    更新:从 Ruby 2.4 开始,Fixnum 和 Bignum 类已经消失,只有 Integer。完全相同的优化仍然存在,但它们被视为“适当的”编译器优化,即在幕后,程序员不可见。


    这有点令人困惑。 Integer 是您应该考虑的 real 类。 Fixnum 基本上是一种性能优化,一开始就不应该让程序员看到。 (将此与 YARV 中的 flonum 进行比较,后者完全作为 VM 内部的优化实现,从未暴露给程序员。)

    基本上,Fixnums 很快,Bignums 很慢(呃),实现会自动在它们之间来回切换。您永远不会直接要求其中之一,您只会得到其中之一,具体取决于您的整数是否适合 Fixnum 的限制大小。

    【讨论】:

    • 所以如果你想实现类似3.to_roman的东西,你应该扩展Integer而不是Fixnum对吧?
    • 这样做会使to_roman 对Fixnum 和Bignum 都可用。如果这是你的目标,那么是的。
    • 目前还不清楚您和@matt 在“Ruby 2.4”之前的状态是否相互矛盾。
    【解决方案2】:

    你永远不会“使用”Integer。它是一个抽象类,其工作是赋予其子级​​(Fixnum 和Bignum)方法。实际上,在任何情况下,您都不会询问对象的类并被告知它是Integer。

    【讨论】:

    • 这个答案对于 Ruby 2.3 和更早的版本是正确的。从 Ruby 2.4 开始是错误的。见其他answer。
    • @matt 当你说“你从不“使用”Integer。它是一个抽象类,它的工作是赋予它的孩子(Fixnum 和Bignum)方法”,是吗?等同于:Integer 是一个抽象类,它为其子类Fixnum 和Bignum 定义了接口,而您从不使用抽象类进行实例化?
    猜你喜欢
    • 2016-06-03
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2012-09-23
    • 2013-09-21
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多