4

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

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

3 回答 3

7

数字

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

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

FIXNUM

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

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

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

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

于 2016-02-22T07:30:00.990 回答
3

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

于 2016-02-22T07:32:58.760 回答
1

is_a?不一样instance_of?,是一样的kind_of?。所以你的前两行没有显示出来Fixnum并且Numeric是相同的。第三行表明它们是不同的。实际上,Fixnum是 的子类Numeric

于 2016-02-22T07:30:18.763 回答