significa - para que sirven los simbolos en ruby
Convertir una matriz de claves y una matriz de valores en un hash en Ruby (5)
Tengo dos matrices como esta:
keys = [''a'', ''b'', ''c'']
values = [1, 2, 3]
¿Hay una forma sencilla en Ruby para convertir esos arreglos en el siguiente hash?
{ ''a'' => 1, ''b'' => 2, ''c'' => 3 }
Esta es mi forma de hacerlo, pero creo que debería haber un método incorporado para hacer esto fácilmente.
def arrays2hash(keys, values)
hash = {}
0.upto(keys.length - 1) do |i|
hash[keys[i]] = values[i]
end
hash
end
Lo mismo se puede hacer usando Array#transpose
método de Array#transpose
. Si está utilizando la versión Ruby> = 2.1 , puede aprovechar el método Array#to_h
, de lo contrario, use a su viejo amigo, Hash::[]
keys = [''a'', ''b'', ''c'']
values = [1, 2, 3]
[keys, values].transpose.to_h
# => {"a"=>1, "b"=>2, "c"=>3}
Hash[[keys, values].transpose]
# => {"a"=>1, "b"=>2, "c"=>3}
Los siguientes trabajos en 1.8.7:
keys = ["a", "b", "c"]
values = [1, 2, 3]
zipped = keys.zip(values)
=> [["a", 1], ["b", 2], ["c", 3]]
Hash[zipped]
=> {"a"=>1, "b"=>2, "c"=>3}
Esto parece no funcionar en versiones anteriores de Ruby (1.8.6). Lo siguiente debe ser compatible con versiones anteriores:
Hash[*keys.zip(values).flatten]
Otra forma es usar each_with_index:
hash = {}
keys.each_with_index { |key, index| hash[key] = values[index] }
hash # => {"a"=>1, "b"=>2, "c"=>3}
Prueba esto, de esta manera la última d
sobrescribirá la anterior c
irb(main):001:0> hash = Hash[[[1,2,3,3], [''a'',''b'',''c'',''d'']].transpose]
=> {1=>"a", 2=>"b", 3=>"d"}
irb(main):002:0>