2015-04-05 30 views
1

在每個Ruby程序Symbol中:x(其中x是允許用作Symbol的名稱的任何字符序列)具有相同的object_id鍵(和一些其他對象)的object_id總是相同的。這是爲什麼?

同樣的事情與假/真/無。

我想知道 - 爲什麼?這是否意味着每次Ruby在代碼執行之前初始化所有這些對象(如false/true/nil)? < --- 已經在這裏回答:約SymbolsHow does object_id assignment work?

什麼?這些初始化嗎?數百萬種可能的組合?它們的.object_id在程序之間怎麼可能是相同的。

+0

我想一個更好的問題是。 「Ruby用來計算對象的'object_id'的方法是什麼?」不用說,如果每次運行Ruby時,特定對象的'object_id'都會發生變化,這是因爲某些事情正在發生變化。由於沒有任何更改,您可以在同一個平臺上爲特定對象指定相同的object_id。 – yeyo 2015-04-05 16:13:10

+0

從這個角度來看,我沒有接近問題!不錯的提示:) – 2015-04-05 16:17:02

+2

http://stackoverflow.com/questions/3430280/how-does-object-id-assignment-work – 2015-04-05 17:33:03

回答

3

所以我搜索在互聯網上找到了這篇文章http://threebrothers.org/brendan/blog/memory-and-ruby-symbols/。我知道ruby進程維護一個symbol table,只要進程存在,每個符號都有一個入口,所以每當創建一個新符號時,ruby都會在該符號表中進行搜索,如果不存在,則會創建一個新的符號到最後一個條目就像數據庫表中的條目一樣。

更多的來源,可以幫助:

Id2sym & symbol.object_id

+1

想要注意的是,在Ruby中垃圾收集器有點過時了。其實符號的GC存在(後告訴它沒有):http://www.sitepoint.com/symbol-gc-ruby-2-2/ – 2015-04-05 19:39:44

+0

添加了一個新的來源,可以幫助 – 2015-04-05 19:48:55

-1

"The Book Of Ruby"

符號是,事實上,一個指針到符號表中。符號 表是Ruby的已知標識符的內部列表 - 例如變量 和方法名稱。

符號作爲關鍵字是有效的,因爲它不能有它的實例。這就像一個常數。

還值得注意的是,每個整數都將具有相同的object_id而不是像String類型。 BooleanFixNumnil具有相同object_id

"Iamnotefficentasakey".object_id #=> Different here 
"Iamnotefficentasakey".object_id #=> Different here 
:iam.object_id #=> Same here 
:iam.object_id #=> Same here 
+0

'還值得注意的是,每個整數都將具有與其他數據類型相同的object_id。「 - 這是錯誤的。 False/True/Nil總是有相同的ID – 2015-04-05 16:18:42

+0

@FilipBartuzi是的。編輯謝謝。 – 2015-04-05 16:24:18

相關問題