31

このp関数を使用してオブジェクトを印刷すると、IDが付与される場合があり、付与されるものとは異なりobject_id()ます。番号が異なる理由は何ですか?

更新:0x4684abcは異なります。369718700x234255E

>> a = Point.new
=> #<Point:0x4684abc>

>> a.object_id
=> 36971870

>> a.__id__
=> 36971870

>> "%X" % a.object_id
=> "234255E"
4

2 に答える 2

53

のデフォルトの実装は、のデフォルトの実装をinspect呼び出します。これは、ドキュメントto_sに示されているように、オブジェクトの16進値を直接表示します(メソッドの説明をクリックしてソースを表示します)。Object#to_s

一方、の実装の基礎となるCソースのコメントは、object_idオブジェクトのタイプに応じて、Ruby値とオブジェクトIDに異なる「名前空間」があることを示しています(たとえば、Fixnum以外のすべての最下位ビットはゼロのようです)。Object#object_id あなたはドキュメントでそれを見ることができます(ソースを明らかにするためにクリックしてください)。

そこから、「オブジェクトIDスペース」(によって返されるobject_id)では、オブジェクトのIDは右側の2番目のビット(最初のビットはゼロ)から始まりますが、「値スペース」(によって使用されるinspect)では、オブジェクトのIDが始まります。右側の3番目のビットから(最初の2ビットはゼロ)。したがって、値を「オブジェクトIDスペース」から「値スペース」に変換するobject_idには、を1ビット左にシフトして、次のように表示されるのと同じ結果を得ることができますinspect

> '%x' % (36971870 << 1)
=> "4684abc"

> a = Foo.new
=> #<Foo:0x5cfe4>
> '%x' % (a.object_id << 1)
=> "5cfe4"
于 2010-05-12T12:53:27.570 に答える
1
0x234255E

=>36971870

違いはありません。メモリアドレスの16進表現です:-)

于 2010-05-12T12:13:42.850 に答える