Como construir um hash Ruby de dois arrays de tamanhos iguais?

92

Eu tenho duas matrizes

a = [:foo, :bar, :baz, :bof]

e

b = ["hello", "world", 1, 2]

eu quero

{:foo => "hello", :bar => "world", :baz => 1, :bof => 2}

Alguma maneira de fazer isso?

Macek
fonte

Respostas:

203
h = Hash[a.zip b] # => {:baz=>1, :bof=>2, :bar=>"world", :foo=>"hello"}

... droga, eu amo Ruby.

jtbandes
fonte
3
É bastante óbvio, mas se alguém estiver se perguntando, se você deseja obter os arrays originais do novo hash, basta chamar h.keyse h.values.
bhaity de
38

Só queria salientar que existe uma maneira um pouco mais limpa de fazer isso:

h = a.zip(b).to_h # => {:foo=>"hello", :bar=>"world", :baz=>1, :bof=>2}

Tenho que concordar com a parte "Eu amo Ruby"!

Lethjakman
fonte
16

Que tal este?

[a, b].transpose.to_h

Se você usa Ruby 1.9:

Hash[ [a, b].transpose ]

Eu sinto que a.zip(b)parece amestre e bescravo, mas nesse estilo eles são planos.

Junichi Ito
fonte
0

Só por curiosidade:

require 'fruity'

a = [:foo, :bar, :baz, :bof]
b = ["hello", "world", 1, 2]

compare do
  jtbandes { h = Hash[a.zip b] }
  lethjakman { h = a.zip(b).to_h }
  junichi_ito1 { [a, b].transpose.to_h }
  junichi_ito2 { Hash[ [a, b].transpose ] } 
end

# >> Running each test 8192 times. Test will take about 1 second.
# >> lethjakman is similar to junichi_ito1
# >> junichi_ito1 is similar to jtbandes
# >> jtbandes is similar to junichi_ito2

compare do 
  junichi_ito1 { [a, b].transpose.to_h }
  junichi_ito2 { Hash[ [a, b].transpose ] } 
end

# >> Running each test 8192 times. Test will take about 1 second.
# >> junichi_ito1 is faster than junichi_ito2 by 19.999999999999996% ± 10.0%
o homem de lata
fonte