在MRI中,看起來rb_id2str()
負責在撥打Symbol#to_s
時完成所有工作。我很驚訝地發現,對於我認爲是相當直接的操作,這是一個非常神祕的功能。MRI內部結構:rb_id2str的詳細解釋
我正在尋找這個功能在做什麼的詳細解釋。作爲參考,這裏是到源鏈接在1.9.3:
http://rxr.whitequark.org/mri/source/parse.y?v=1.9.3-p195#9950
一些具體問題:
什麼是四大if
塊做什麼?
if (id < tLAST_TOKEN)
if (id < INT_MAX && rb_ispunct((int)id))
if (st_lookup(global_symbols.id_str, id, &data))
if (is_attrset_id(id))
這將是巨大的,得到的一般概述什麼內部的if語句的做法,但它不每個代碼塊」需要進行逐行分析。
最後,我很好奇的to_s
內存/垃圾收集的意義:不調用Symbol#to_s
創建具有進行垃圾回收每一次,或者是有類似的東西使用內部寫入時複製優化的新字符串直到對字符串進行突變爲止,對符號的實際表示的引用?
'rb_id2str'做的不僅僅是這些。 '符號#to_s'實際上等同於'rb_sym_to_s'。該函數使用'SYM2ID'獲取對象的ID,然後只用'SYM2ID'返回的ID作爲參數來調用'rb_id2str',以從對象的ID構造字符串。不過,我可能會錯過一些步驟。我確信與'to_s'相關的內存使用情況,但我猜(並希望)它不會創建一個新的字符串 – omninonsense