为什么我不能在Ruby中实例化Integer类?

时间:2017-08-15 12:45:01

标签: ruby

我认为Ruby中的所有类都可以实例化。是什么阻止Integer类被new方法实例化?

Integer.new
# => NoMethodError: undefined method `new' for Integer:Class

2 个答案:

答案 0 :(得分:8)

其中有一些。除IntegerFloatSymbol外,您也无法创建TrueClassFalseClassNilClass的新实例。

这些类(及其各自的实例)在Ruby中都很特殊,并且在内部以特定方式处理。

以小整数为例,Ruby隐式处理这些。而不是创建一个新的&#34;实际&#34;每个整数的Ruby对象(这将非常浪费),Ruby将它们仅存储为object_id表示的数值。因此,您在Ruby中观察到的Integer类的实例实际上是单值im内存(或多或少)。为了能够解决这个问题,Ruby为整数值保留所有奇数object_id s。因此,1的{​​{1}} object_id 32 object_id的{​​{1}}等等... < / p>

由于Ruby语言本身的这种特殊处理,您无法创建新的Integer实例。现在假设整数本身总是不可变的(也就是说,它们无法改变),它们只是首先由它们的数值定义。

(注意,这仅适用于小整数。对于较大的整数,取决于您是在32位还是64位架构上运行,如果整数不能适合,Ruby仍会在内部创建实际对象但是,这是由Ruby内部处理的,基本上是语言本身的实现细节。)

答案 1 :(得分:3)

您无法在Ruby中分配Integer的堆对象。在Ruby中,Integers是immediates,这意味着你不能拥有该对象的实例化版本。由于无法分配它们,因此无法创建子类并分配子类的实例。