【问题标题】:What is the difference between Fixnum and Numeric [duplicate]Fixnum和Numeric有什么区别[重复]
【发布时间】:2016-06-03 12:39:10
【问题描述】:

它们看起来是等价的,但比较起来却是错误的:

5.is_a? Fixnum
# => true
5.is_a? Numeric
# => true
Numeric == Fixnum
# => false

【问题讨论】:

  • Numeric 是所有数字类的基类,例如 FixnumFloatRational。搜索 ruby numeric class hierarchy 以获得概览。
  • 啊,谢谢!仔细看,你是否同意以下几点:所有是 Fixnum 的都是 Numeric 类的实例,但不是所有的 Numeric 都是 Fixnum
  • @GMarx 是Fixnum < Integer < Numeric < Object。您还可以得出结论 “每个 Integer 都是 Object,但并非每个 Object 都是 Integer” - 很明显,不是吗?
  • 完美,谢谢@Stefan

标签: ruby-on-rails ruby ruby-on-rails-3 numeric fixnum


【解决方案1】:

数字

Numeric 是所有更高级别的数字类都应继承的类。

Numeric 允许实例化堆分配的对象。其他核心数值类如 Integer 被实现为立即数,这意味着每个 Integer 都是一个始终按值传递的单个不可变对象。

FIXNUM

Fixnum 保存可以用本机机器字(减 1 位)表示的整数值。如果对 Fixnum 的任何操作超出此范围,则该值会自动转换为 Bignum。

Fixnum 对象具有直接价值。这意味着当它们被分配或作为参数传递时,传递的是实际对象,而不是对该对象的引用。

注意:每个 Fixnum 都是 Numeric,但每个 Numeric 都不是 Fixnum。

更新: Ruby 2.4 将 fixnum 和 bignum 统一为整数。

【讨论】:

    【解决方案2】:

    Numeric == Fixnum 返回false,因为它们是不同的类。

    is_a? 不检查对象的具体类,即instance_of?。这是is_a?的文档:

    如果 class 是 obj 的类,或者 class 是 obj 的超类之一或 obj 中包含的模块,则返回 true。

    正如另一个答案中提到的,FixnumNumeric 的子类,这就是为什么5.is_a? Fixnum5.is_a? Numeric 都返回true

    【讨论】:

      【解决方案3】:

      is_a?instance_of? 不同,它与kind_of? 相同。所以你的前两行没有显示FixnumNumeric 是相同的。第三行表明它们是不同的。事实上,FixnumNumeric 的子类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 2017-02-17
        • 2011-09-27
        • 2013-04-22
        • 2012-03-29
        • 1970-01-01
        相关资源
        最近更新 更多