我认为Ruby中的所有类都可以实例化.什么阻止Integer类被new方法实例化?
Integer.new
# => NoMethodError: undefined method `new' for Integer:Class
Run Code Online (Sandbox Code Playgroud)
其中有一些.此外Integer,Float和Symbol,你不能创建一个新的实例TrueClass,FalseClass和NilClass也.
这些类(及其各自的实例)在Ruby中都很特殊,并且在内部以特定方式处理.
以小整数为例,Ruby隐式处理这些.而不是为每个整数创建一个新的"实际"Ruby对象(这将是非常浪费),Ruby将这些仅存储为object_id表示的数值.因此,您在Ruby中观察到的Integer类的实例实际上是单值im内存(或多或少).为了能够解决这个问题,Ruby object_id为整数值保留了所有奇数.因此,数字1具有object_id的3,数量2有object_id的5等等...
由于Ruby语言本身的这种特殊处理,您无法创建新的Integer实例.现在假设整数本身总是不可变的(也就是说,它们不能被改变),它们只是首先由它们的数值定义.
(请注意,这仅适用于小整数.对于较大的整数,取决于您是在32位还是64位架构上运行,如果整数不适合上述方案,Ruby仍将在内部创建实际对象.然而,这是由Ruby内部处理的,基本上是语言本身的实现细节.)
| 归档时间: |
|
| 查看次数: |
776 次 |
| 最近记录: |