07.10.2010
Ruby: Array in Hash umwandeln
Manchmal möchte man in Ruby ein Array in einen Hash umwandeln. Angenommen, man hat die Ausgabe von I18n.available_locales
locales = [:en, :de, :fr]
und möchte daraus einen Hash für ein Select-Element erzeugen, etwa so:
{:en => 'EN', :de => 'DE', :fr => 'FR'}
Wie macht man das möglichst elegant?
Zunächst gibt es natürlich inject:
locales.inject({}) {|hsh, sym| hsh[sym] = sym.to_s.upcase; hsh}
Aber den folgenden Ansatz finde ich deutlich besser, vor allem weil er die Absicht klarer zum Ausdruck bringt (und nebenbei auch schneller ist):
Hash[locales.map{|sym| [sym, sym.to_s.upcase]}]
Zur Erinnerung: Hash[[[:a,:b],[:c,:d]]] (ebenso wie Hash[:a,:b,:c,:d])
ergibt {:a => :b, :c => :d}.