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

Max*_*s S 4 ruby

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

Integer.new
# => NoMethodError: undefined method `new' for Integer:Class
Run Code Online (Sandbox Code Playgroud)

Hol*_*ust 9

其中有一些.此外Integer,FloatSymbol,你不能创建一个新的实例TrueClass,FalseClassNilClass也.

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

以小整数为例,Ruby隐式处理这些.而不是为每个整数创建一个新的"实际"Ruby对象(这将是非常浪费),Ruby将这些仅存储为object_id表示的数值.因此,您在Ruby中观察到的Integer类的实例实际上是单值im内存(或多或少).为了能够解决这个问题,Ruby object_id为整数值保留了所有奇数.因此,数字1具有object_id3,数量2object_id5等等...

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

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

  • 从技术上讲,它们是实际的(没有引号)ruby对象(`rb_cInteger`)ruby只是不创建"新"的.作为父类的`Numeric`是一个实际的ruby对象,可以实例化.`Float`,`Integer`等简单地取消定义`#new`以便它们可以是immediates(不可变并且总是按值传递).但对于一个相当复杂的主题,这是一个相当简洁的答案. (2认同)