From: Gavin Sinclair Date: 2003-07-19T23:22:20+09:00 Subject: Proposal: Array#to_h, to simplify hash generation Hi -talk, Ruby has wonderful support for chewing and spitting arrays. For instance, it's easy to produce an array from any Enumerable using #map. With hashes, however, it's a bit more cumbersome. For example, the following method is typical of my code: # return { filename -> size } def get_local_gz_files files = {} Dir["*.gz"].each do |filename| files[filename] = File.stat(filename).size end files end The pattern is: create an empty hash, populate it, and return it. Now Ruby is a wonderfully expressive and terse language. Accordingly, the two lines devoted to initialising and returning the hash in the above code seem wasted. If Ruby had Array#to_h, then I could rewrite it as: # return { filename -> size } def get_local_gz_files Dir["*.gz"].map { |filename| [ filename, File.stat(filename).size ] }.to_h end The proposed implementation of Array#to_h is per the following code: class Array def to_h hash = {} self.each do |elt| raise TypeError unless elt.is_a? Array key, value = elt[0..1] hash[key] = value end hash end end For the final justification, note that this is the logical reverse of Hash#to_a: h = {:x => 5, :y => 10, :z => -1 } a = h.to_a # => [[:z, -1], [:x, 5], [:y, 10]] # And now, for my next trick... a.to_h == h # => true (gosh, that actually worked) Thoughts? Gavin