我提出了一個 ruby?? 哈希的例子,我不太明白在引擎蓋下發生了什么:
root = {}
base = root
base[:a] = {}
base = base[:a]
p base
=> {}
p root
=> {:a=>{}}
當我base = base[:a]按預期分配時base變成{},但為什么root不會變成{}?
uj5u.com熱心網友回復:
我只需要一點點推動就可以理解,感謝@Stefan,我想我可以回答我自己的問題。分解它,我們有:
root = {}
base = root
puts root.object_id
=> 47193371579760
puts base.object_id
=> 47193371579760
因此,無論root并且base成為同一個物件的參考。
base[:a] = {}
base[:a].object_id
=> 47193372751820
base = base[:a]
puts base.object_id
=> 47193372751820
puts root.object_id
=> 47193371579760
puts root
base[:a]是一個新的哈希物件,base分配給它成為這個物件,同時root保留對舊物件的參考{:a=>{}}。這就是為什么root最后沒有改變的原因。
uj5u.com熱心網友回復:
Array、Symbol 和 Hash 是一些參考變數。類似的概念存在于所有語言中。以javascript為例,我們可以將淺拷貝和深拷貝的概念聯系起來,其中哈希被物件替換。
以下是為您的查詢添加的一些解釋。
root = {}
# root = {}
base = root
# both base & root variables point to single location, principle of reference object
base[:a] = {}
# base aka root variable is holding value { a: {} }
base = base[:a]
# base variable is not pointing to root variable location, it is re-assigned with new value which is also hash (reference object)
p base
=> {}
p root
=> {:a=>{}}
base[:b] = 4
=> 4
p base
=> {:b=>4}
p root
=> {:a=>{:b=>4}}
使用object_id功能您可以驗證地址。要進行深復制,請使用clone哈希函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389760.html
標籤:红宝石
下一篇:在Ruby中尋找特定概念的名稱
