rails - Añada un par de clave/valor al hash con<< en Ruby
ruby hash to json (6)
En Ruby, uno puede agregar valores a las matrices existentes usando <<:
a = []
a << "foo"
pero, ¿también puede agregar pares clave / valor a un hash existente?
h = {}
h << :key "bar"
Sé que puedes hacer:
h[:key] = ""
h[:key] << "bar"
pero eso no es lo que quiero.
Gracias.
¡Hay merge!
.
h = {}
h.merge!(key: "bar")
# => {:key=>"bar"}
¡Similar como son, se merge!
y store
los hashes existentes de forma diferente según los nombres de clave y, por lo tanto, afectará su preferencia. ¡Aparte de eso desde el punto de vista de la sintaxis, merge!
''s key: "value"
sintaxis de key: "value"
coincide estrechamente con JavaScript y Python. Siempre he odiado los pares de pares clave-valor que separan las comas, personalmente.
hash = {}
hash.merge!(key: "value")
hash.merge!(:key => "value")
puts hash
{:key=>"value"}
hash = {}
hash.store(:key, "value")
hash.store("key", "value")
puts hash
{:key=>"value", "key"=>"value"}
Para que el operador de la pala <<
funcione, recomendaría usar la respuesta de Mark Thomas .
¿Quizás quieras Hash # merge?
1.9.3p194 :015 > h={}
=> {}
1.9.3p194 :016 > h.merge(:key => ''bar'')
=> {:key=>"bar"}
1.9.3p194 :017 >
Si desea cambiar la matriz en su lugar, use merge!
1.9.3p194 :016 > h.merge!(:key => ''bar'')
=> {:key=>"bar"}
Como los hashes no están ordenados intrínsecamente, no existe la noción de agregarlos. Los hashes de Ruby desde 1.9 mantienen el orden de inserción, sin embargo. Estas son las formas de agregar nuevos pares clave / valor.
La solución más simple es
h[:key] = "bar"
Si quieres un método, utiliza la store
:
h.store(:key, "bar")
Si realmente quieres usar un operador "pala" ( <<
), en realidad se agrega al valor del hash como una matriz, y debes especificar la clave:
h[:key] << "bar"
Lo anterior solo funciona cuando la clave existe. Para añadir una nueva clave, debe inicializar el hash con un valor predeterminado, que puede hacer así:
h = Hash.new {|h, k| h[k] = ''''}
h[:key] << "bar"
Es posible que tengas la tentación de usar parches Hash para incluir un operador de pala que funcione de la forma en que escribiste:
class Hash
def <<(k,v)
self.store(k,v)
end
end
Sin embargo, esto no hereda el "azúcar sintáctico" aplicado al operador de pala en otros contextos:
h << :key, "bar" #doesn''t work
h.<< :key, "bar" #works
No, no creo que puedas agregar pares clave / valor. Lo único más cercano que conozco es usar el método de la store
:
h = {}
h.store("key", "value")
Tenía que hacer algo similar, pero necesitaba agregar valores con las mismas claves. Cuando utilizo fusionar o actualizar, no puedo presionar valores con las mismas teclas. Entonces tuve que usar una matriz de hashes.
my_hash_static = {:header =>{:company => ''xx'', :usercode => ''xx'', :password => ''xx'',
:type=> ''n:n'', :msgheader => from}, :body=>[]}
my_hash_dynamic = {:mp=>{:msg=>message, :no=>phones} }
my_hash_full = my_hash_static[:body].push my_hash_dynamic