ruby-1.9.2-p180 :154 > a = []
=> []
ruby-1.9.2-p180 :154 > h = {:test => "test"}
=> {:test=>"test"}
ruby-1.9.2-p180 :155 > a << h
=> [{:test=>"test"}]
ruby-1.9.2-p180 :156 > h.clear
=> {}
ruby-1.9.2-p180 :157 > a
=> [{}]
Som veľmi zmätený, hlavne preto, že sa môžem zmeniťprvky hashu bez toho, aby to ovplyvnilo pole. Ale keď vymažem hash, pole je aktualizované a zbavené obsahu hash. Môže mi niekto vysvetliť?
odpovede:
5 pre odpoveď č. 1Keď to urobíte a << h
, naozaj odkazujete na h. Takže keď aktualizujete písmeno h, zobrazí sa aj tieto zmeny, pretože obsahujú skôr odkaz ako kópiu tejto hodnoty.
Aby sa nezmenila v, musíte odovzdať klonovanú hodnotu h do a.
Príkladom by bolo:
a << h.clone
1 pre odpoveď č. 2
Ruby nerobí kópie tohto hashu, keď ho pridáte do poľa - jednoducho uloží a referencie na pôvodnú premennú. Keď teda vyprázdňujete pôvodnú premennú, odkaz uložený v poli sa teraz vzťahuje na prázdny hash.
Ak chcete skopírovať hashovací prvok, aby sa tak nestalo, použite Ruby clone
metóda.
ruby-1.9.2-p136 :049 > h = { :test => "foo" }
=> {:test=>"foo"}
ruby-1.9.2-p136 :050 > a = []
=> []
ruby-1.9.2-p136 :051 > a << h.clone
=> [{:test=>"foo"}]
ruby-1.9.2-p136 :052 > h.clear
=> {}
ruby-1.9.2-p136 :053 > a
=> [{:test=>"foo"}]