-1

私はRubyを学んでいます。私はO'Reillyの本「TheRubyProgrammingLanguage」を持っています。

「オブジェクトクラスは、オブジェクトのIDを返すだけのハッシュメソッドを実装しています。」

私は他の本でもこの主張を見ました:http://my.safaribooksonline.com/book/web-development/ruby/9780321700308/create-classes-that-understand-equality/ch12lev1sec8

しかし、このコードを実行すると、2行で同じ数が生成されません。

myObject = Object.new

puts myObject.hash
puts myObject.object_id

それで、取引は何ですか?Ruby1.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 へのすべての呼び出しで同じ番号が返され、2 つのアクティブなオブジェクトが 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 に答える