它们看起来是等价的,但是在比较它们时,它是错误的:
5.is_a? Fixnum
# => true
5.is_a? Numeric
# => true
Numeric == Fixnum
# => false
它们看起来是等价的,但是在比较它们时,它是错误的:
5.is_a? Fixnum
# => true
5.is_a? Numeric
# => true
Numeric == Fixnum
# => false
数字
Numeric 是所有更高级别的数字类都应继承的类。
Numeric 允许实例化堆分配的对象。其他核心数字类(例如 Integer)被实现为立即数,这意味着每个 Integer 都是一个始终按值传递的单个不可变对象。
FIXNUM
Fixnum 保存可以用本机机器字(减 1 位)表示的整数值。如果对 Fixnum 的任何操作超出此范围,则该值将自动转换为 Bignum。
Fixnum 对象具有直接的价值。这意味着当它们被分配或作为参数传递时,传递的是实际对象,而不是对该对象的引用。
注意:每个 Fixnum 都是 Numeric,但每个 Numeric 都不是 Fixnum。
更新: Ruby 2.4 将 fixnum 和 bignum 统一为整数。
Numeric == Fixnum
返回false
,因为它们是不同的类。
is_a?
不检查对象的特定类,即instance_of?
. 这是文档is_a?
:
如果 class 是 obj 的类,或者 class 是 obj 的超类之一或 obj 中包含的模块,则返回 true。
正如另一个答案中提到的,Fixnum
是 的子类Numeric
,这就是为什么5.is_a? Fixnum
两者5.is_a? Numeric
都返回true
。
is_a?
不一样instance_of?
,是一样的kind_of?
。所以你的前两行没有显示出来Fixnum
并且Numeric
是相同的。第三行表明它们是不同的。实际上,Fixnum
是 的子类Numeric
。