我认为Ruby中的所有类都可以实例化。是什么阻止Integer
类被new
方法实例化?
Integer.new
# => NoMethodError: undefined method `new' for Integer:Class
答案 0 :(得分:8)
其中有一些。除Integer
,Float
和Symbol
外,您也无法创建TrueClass
,FalseClass
和NilClass
的新实例。
这些类(及其各自的实例)在Ruby中都很特殊,并且在内部以特定方式处理。
以小整数为例,Ruby隐式处理这些。而不是创建一个新的"实际"每个整数的Ruby对象(这将非常浪费),Ruby将它们仅存储为object_id表示的数值。因此,您在Ruby中观察到的Integer类的实例实际上是单值im内存(或多或少)。为了能够解决这个问题,Ruby为整数值保留所有奇数object_id
s。因此,1
的{{1}} object_id
3
,2
object_id
的{{1}}等等... < / p>
由于Ruby语言本身的这种特殊处理,您无法创建新的Integer实例。现在假设整数本身总是不可变的(也就是说,它们无法改变),它们只是首先由它们的数值定义。
(注意,这仅适用于小整数。对于较大的整数,取决于您是在32位还是64位架构上运行,如果整数不能适合,Ruby仍会在内部创建实际对象但是,这是由Ruby内部处理的,基本上是语言本身的实现细节。)
答案 1 :(得分:3)
您无法在Ruby中分配Integer的堆对象。在Ruby中,Integers是immediates,这意味着你不能拥有该对象的实例化版本。由于无法分配它们,因此无法创建子类并分配子类的实例。