2010-05-12 21 views

回答

45

的默認實現inspect調用to_s的默認實現,它只顯示對象di的十六進制值直截了當,如在Object#to_sdocs(點擊方法描述以顯示源)中看到的。

同時,根據對象的類型,C語言源代碼的實現object_id中的註釋顯示,Ruby值和對象ID有不同的「名稱空間」(例如,最低位似乎爲零, Fixnums)。你可以看到在Object#object_iddocs(點擊顯示來源)。從那裏我們可以看到,在「對象id空間」(由object_id返回)中,對象的ID從右邊的第二位開始(第一位爲零),但是在「值空間」(由inspect使用),它們從右邊的第三位開始(前兩位爲零)。因此,將值從「對象ID空間」到「價值空間」轉換,我們可以通過一個位object_id向左移動,並獲得由inspect顯示同樣的結果:

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

> a = Foo.new 
=> #<Foo:0x5cfe4> 
> '%x' % (a.object_id << 1) 
=> "5cfe4" 
+0

哈哈,你是否在休閒時間編寫編譯器以獲得樂趣? – 2010-05-12 13:04:44

+0

那些ruby-doc.org鏈接現在已經死了:-( – AlexChaffee 2011-10-10 15:04:54

+0

@AlexChaffee我找不到指向指向方法源的鏈接了,用間接鏈接編輯了文章。 – Arkku 2011-10-11 01:46:44

1
0x234255E 

=>36971870 

它不一樣,它的內存地址的十六進制表示:-)

+2

而'4684abc'? – Jeriko 2010-05-12 12:24:45

+0

是它的意思是比較0x4684abc和36971870 – 2010-05-12 12:38:04

+0

0x4684abc = 2 * 0x234255E,但是爲什麼? )) – andrykonchin 2010-05-12 12:56:42

相關問題