のデフォルトの実装は、のデフォルトの実装を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"