-1

我正在学习红宝石。我有 O'Reilly 的书“The Ruby Programming Language”,其中明确指出:

“对象类实现散列方法以简单地返回对象的 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。

4

3 回答 3

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);
}
于 2012-09-11T01:23:36.193 回答
1

object_id → fixnum

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

哈希()

为此对象生成一个 Fixnum 哈希值。该函数必须具有 a.eql?(b) 蕴含 a.hash == b.hash 的性质。哈希值由 Hash 类使用。任何超过 Fixnum 容量的哈希值在使用前都会被截断。

恢复:整数标识符不生成散列。

于 2012-09-11T01:24:33.647 回答
0

在 Rubyobject_id中是一个实例方法Object

在此处输入图像描述

hash也是 的实例方法Object,但在各个子类中都进行了重写。喜欢String

在此处输入图像描述

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

于 2016-01-27T07:30:17.210 回答