He tratado de expresar esto lo mejor que he podido. Tengo un hash en el que realizo algunas operaciones, pero antes de hacerlo, almaceno este hash en otra variable. Ahora, cuando accedo a esta variable, los valores parecen haber cambiado, ¿cómo puedo evitarlo? Ejemplo:
hash = {a: "1", b: "2", c: "3"} hash_copy = hash hash["a"]=4 puts(hash_copy["a"]) #prints 4 instead of 1¿Cómo puedo hacer que la instrucción put imprima 1 en lugar de 4, es decir, imprima el valor original?
deep_dup es tu amigo hash_copy = hash solo está asignando un puntero sin hacer una copia
por lo tanto, las opciones específicas de Ruby son clone y copia deep_copy En su caso, la copy funcionará, pero ambas deberían funcionar bien para usted.
clon de rubí
hash_copy = hash.cloneRails, un poco defectuoso en versiones anteriores de Rails, pero es una función Ruby y funcionará para usted
hash_copy = hash.deep_dupes lo que necesitas
Use Hash#merge en su lugar, que devuelve una copia modificada del hash:
hash = {a: "1", b: "2", c: "3"} hash_copy = hash.merge(a: 4)En general, la asignación de claves hash solo debe hacerse para modificar explícitamente un hash; para todo lo demás, existen mejores métodos.