整数是特殊的

在 Ruby 中,整数(integer,亦 Fixnum)具有固定的标识。数字 10 的每个实例或者赋值为 10 的每个变量将具有相同的 object_id。其它数据类型并非如此。浮点数(例如 10.5)或者字符串(例如 “hello world”)的每个实例都是具有唯一 object_id 的不同对象。请注意,当你为变量分配整数(integer)值时,该变量将具有整数值本身 object_id。但是,当你将某些其它类型的数据分配给变量时,即使每次分配的数据值本身相同,也会创建一个新对象:

  1. # 10 and x after each assignment are the same object
  2. puts( 10.object_id )
  3. x = 10
  4. puts( x.object_id )
  5. x = 10
  6. puts( x.object_id )
  7. # 10.5 and x after each assignment are 3 different objects!
  8. puts( 10.5.object_id )
  9. x = 10.5
  10. puts( x.object_id )
  11. x = 10.5
  12. puts( x.object_id )

但为什么这些都很重要?

答案是,因为该规则的一些罕见例外是相当重要的。正如我之前所说,大部分情况下,方法都有明确定义的入口和明确定义的出口。一旦参数进入方法,它就会进入一个封闭的空间。该方法之外的任何代码都无法了解对参数所做的任何更改,直到它以返回值的形式再次出来。事实上,这是“纯粹”(pure)的面向对象的深层秘密之一。原则上,方法的实现细节应该隐藏起来 - “封装”(encapsulated)。这可以确保对象外部的代码不能依赖于该对象内发生的事情。