Ruby 为什么对象id在windows上而不是linux上持续存在?

Ruby 为什么对象id在windows上而不是linux上持续存在?,ruby,windows,objectid,Ruby,Windows,Objectid,这个节目 class ObjectGarden class << self.clone puts self.object_id end end puts ObjectGarden.clone.object_id class对象花园 类对于ruby中的大多数对象,从#object_id中获得的数字实际上是指向对象的内部C数据结构的指针。这个数据结构反过来又由ruby实现/构建使用的任何内存分配器为其分配空间 在不阅读代码的情况下,我猜linu

这个节目

class ObjectGarden
    class << self.clone
            puts self.object_id
    end
end

puts ObjectGarden.clone.object_id
class对象花园

类对于ruby中的大多数对象,从
#object_id
中获得的数字实际上是指向对象的内部C数据结构的指针。这个数据结构反过来又由ruby实现/构建使用的任何内存分配器为其分配空间

在不阅读代码的情况下,我猜linux版本每次都会产生不同的结果,因为ruby或C分配器故意使用随机偏移量作为分配或指针,使它们难以猜测,从而使程序更安全

ruby对
object\u id
只有一个保证:只要特定对象存在,它的
object\u id
对于ruby解释器来说是唯一的,不会改变。这就是全部。您甚至可以为一个对象获取与之前创建的对象相同的
object\u 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”
实际上创建了一个新对象,具有一个新的
对象id
,其中使用
#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"

如果修改对象,
对象\u id
会更改吗?这与状态相反:
对给定对象的id的所有调用都将返回相同的号码。非常有趣。我只想指出,
object\u id
显然只是将内部
转换为
Fixnum
。前者可能只是Ruby VM用来标识对象的一个整数?您不应该依赖对象的精确值_id@Frederick我只是觉得很有趣,想知道每个平台是否有不同的算法来生成对象id。如果是,为什么?它解决了什么目的和/或导致这种设计的操作系统限制是什么?我认为它(基本上)是对象在内存中的地址(除了nil/true/false/fixnum/symbol等直接值。似乎没有每个操作系统的代码路径,但是不同的操作系统会有不同的内存布局方法(特别是ASLR等)@FrederickCheung无论内存布局如何,ObjectGarden克隆的singleton类应该始终是ObjectGarden的另一个不同克隆的不同实例。Michael,但它没有解释ruby on Windows的行为方式,即某种程度上扩展了对象id在ru的多个实例中保持唯一的保证翻译。