Ruby,hash和object_id

时间:2015-05-03 08:30:28

标签: ruby memory

我使用Ruby 2.2.2。

irb(main):002:0> str = "abc"
=> "abc"
irb(main):003:0> str2 = "abc"
=> "abc"
irb(main):004:0> str.hash
=> -340360941
irb(main):005:0> str2.hash
=> -340360941
irb(main):006:0> str.object_id
=> 3702564
irb(main):007:0> str2.object_id
=> 24864312
irb(main):009:0> str == str2
=> true
irb(main):010:0> str.eql? str2
=> true

为什么strstr2具有相同的哈希值,但object_id不同?根据文档hashobject_id,没有两个活动对象会共享ID,因此strstr2具有不同的object_id,但如何理解他们的{ {1}}是一样的吗?

有人能说些什么吗?我的猜测是hash只占用一个内存空间,而"abc"str都引用了相同的内存空间。

如果有人能够解释内存的分配方式,那就太棒了。

1 个答案:

答案 0 :(得分:2)

  

我的猜测是“abc”只占用一个内存空间,而strstr2都引用了相同的内存空间。

这是否属实,他们的object_id是一样的。该字符串创建两次,str实例与str2实例无关。否则,str[1] = "A"导致两个变量都发生变化,将str2的值转换为aAc

当对象的值相等时,它们的哈希值应相等,以便快速查找/搜索等。

E.g。来自俄亥俄州的约翰史密斯和来自俄克拉荷马州的约翰史密斯有着相同的名字,是什么让他们的hash相等,但由于他们肯定不是同一个人,他们的object_id不同。