对于 ruby 中的大多数对象,您从中获得的数字#object_id
实际上是指向该对象的内部 C 数据结构的指针。该数据结构又通过 ruby 实现/构建使用的任何内存分配器为其分配空间。
如果不阅读代码,我会猜测 linux 版本每次都会产生不同的结果,因为某些东西,无论是 ruby 还是 C 分配器,都故意为分配或指针使用随机偏移量,以使它们难以猜测,从而使程序更多安全的。
ruby 对 's 只有一个保证object_id
:只要一个特定对象存在,它object_id
对于那个 ruby 解释器来说是唯一的并且不会改变。就这样。object_id
如果对象最终获得相同的内存块,您甚至可以获得与之前创建的对象和后来的垃圾收集对象相同的对象。
另请注意,如果您执行以下操作:
irb(main):001:0> a = "hi"
=> "hi"
irb(main):002:0> a.object_id
=> 14348380
irb(main):003:0> a = a + " there"
=> "hi there"
irb(main):004:0> a.object_id
=> 14197020
该行a = a + " there"
实际上创建了一个带有 new 的新对象,而object_id
using#concat
没有:
irb(main):005:0> a = "hi"
=> "hi"
irb(main):006:0> a.object_id
=> 12031400
irb(main):007:0> a.concat " there"
=> "hi there"
irb(main):008:0> a.object_id
=> 12031400
另请注意,在 ruby 中,赋值将分配的变量绑定到对象,因此将一个变量分配给另一个变量会将它们都指向同一个对象:
irb(main):011:0> a = "hi"
=> "hi"
irb(main):012:0> a.object_id
=> 12081640
irb(main):013:0> b = a
=> "hi"
irb(main):014:0> b.object_id
=> 12081640
所以改变一个变量会改变另一个:
irb(main):015:0> a.concat " there"
=> "hi there"
irb(main):016:0> b
=> "hi there"