/ / ¿Por qué la eliminación de mi hash, también elimina mi matriz de hashes? - Ruby, matrices, hash

¿Por qué limpiar mi hash también borra mi variedad de hashes? - ruby, arrays, 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
=> [{}]

Estoy muy confundido, sobre todo porque puedo cambiar.Los elementos del hash sin que esto afecte a la matriz. Pero cuando borro el hash, la matriz se actualiza y se borra de su contenido de hash. ¿Alguien puede explicar?

Respuestas

5 para la respuesta № 1

Cuando tu lo hagas a << h, realmente estas pasando la referencia de h a a. Así que cuando actualice h, también verá esos cambios porque contiene una referencia en lugar de una copia de ese valor.

Para que no cambie en a, debe pasar un valor clonado de h a a.

Un ejemplo sería:

a << h.clone

1 para la respuesta № 2

Ruby no hace un dupdo de este hash cuando lo agrega a la matriz - simplemente almacena un referencia a la variable original. Entonces, cuando vacía la variable original, la referencia almacenada en la matriz ahora se refiere al hash vacío.

Si desea copiar el elemento hash para que esto no ocurra, use Ruby "s clone método.

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