/ / Prečo čistím hash, tiež hash hash? - rubín, polia, hash

Prečo vyčistenie môjho hash, tiež jasné moje pole hades? - rubín, polia, hash

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ď č. 1

Keď 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"}]