Ruby中的哈希方法没有返回object_id

时间:2012-09-11 01:15:47

标签: ruby

我正在学习Ruby。我收到了O'Reilly的书“红宝石程序设计语言”,其中明确指出:

“Object类实现了哈希方法,只返回一个对象的ID。”

我也在其他书籍中看到了这个断言:http://my.safaribooksonline.com/book/web-development/ruby/9780321700308/create-classes-that-understand-equality/ch12lev1sec8

但是当我运行此代码时,这两行不会生成相同的数字:

myObject = Object.new

puts myObject.hash
puts myObject.object_id

那是什么交易?我正在运行Ruby 1.9.3。

3 个答案:

答案 0 :(得分:1)

Object实现哈希object_id。该值不是object_id,但object_id是哈希函数的输入。

通过https://github.com/ruby/ruby/blob/trunk/object.c#L110

VALUE
rb_obj_hash(VALUE obj)
{
    VALUE oid = rb_obj_id(obj);
    st_index_t h = rb_hash_end(rb_hash_start(NUM2LONG(oid)));
    return LONG2FIX(h);
}

答案 1 :(得分:1)

object_id→fixnum

返回 obj的整数标识符。对于给定对象的所有id调用都将返回相同的数字,并且没有两个活动对象将共享id。

散列()

为此对象生成 Fixnum哈希值。此函数必须具有a.eql?(b)暗示a.hash == b.hash的属性。散列值由Hash类使用。任何超出Fixnum容量的哈希值在被使用之前都将被截断。

恢复:不生成整数标识符哈希。

答案 2 :(得分:0)

Ruby object_idObject的实例方法。

enter image description here

hash也是Object的实例方法,但它已在每个子类中重新编写。 比如String

enter image description here

没有证据表明hash应将保存值返回为object_id。它们是为了不同目的而创建的。