Fixnum和Numeric有什么区别

时间:2016-02-22 07:08:48

标签: ruby-on-rails ruby numeric fixnum

它们似乎相同,但在比较它们时,它是错误的:

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

3 个答案:

答案 0 :(得分:5)

<强> NUMERIC

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

Numeric允许实例化堆分配的对象。其他核心数字类(如Integer)实现为immediates,这意味着每个Integer都是一个永远按值传递的单个不可变对象。

<强> Fixnum对象

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

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

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

答案 1 :(得分:3)

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

is_a?不检查对象所属的特定类,即instance_of?。这是is_a?的文档:

  

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

正如其他答案所述,FixnumNumeric的子类,这就是为什么5.is_a? Fixnum5.is_a? Numeric都返回true

答案 2 :(得分:1)

is_a?instance_of?不同,与kind_of?相同。因此,前两行并未显示FixnumNumeric相同。第三行表明它们是不同的。实际上,FixnumNumeric的子类。