blog

A helper method to create a lot of Hash objects

Posted 16.10.2009

There are some situations in which you need to create a lot of Hash objects, such as creating dummy data for a test or benchmark.

For example:

testdata = [
  { :name => "Haruhi", :gender => "F", :role => "Brigade Leader" },
  { :name => "Mikuru", :gender => "F", :role => "Time Traveler" },
  { :name => "Yuki",   :gender => "F", :role => "Humanoid Interface" },
  { :name => "Haruhi", :gender => "M", :role => "ESPer" },
  { :name => "Kyon",   :gender => "M", :role => "Normal" },
]

But you may draw a sigh or be tired because you must type same keys many times.

In this case, the following helper method will help you.

class Hash
  def self.create_with(*keys)
    rows = yield()
    return rows.collect {|row|
      hash = self.new
      keys.zip(row) {|k, v| hash[k] = v }
      hash
    }
  end
end

Using this helper method, you have to type keys only once.

testdata = Hash.create_with(:name, :gender, :role) {[
  [ "Haruhi", "F", "Brigade Leader"     ],
  [ "Mikuru", "F", "Time Traveler"      ],
  [ "Yuki",   "F", "Humanoid Interface" ],
  [ "Haruhi", "M", "ESPer"              ],
  [ "Kyon",   "M", "Normal"             ],
]}

p testdata[0]  #=> {:gender=>"F", :role=>"Brigade Leader", :name=>"Haruhi"}

It is a good idea to use YAML format instead of array of arrays.

require 'yaml'
arrays = YAML.load <<END
- [ Haruhi, F, Brigade Leader     ]
- [ Mikuru, F, Time Traveler      ]
- [ Yuki,   F, Humanoid Interface ]
- [ Haruhi, M, ESPer              ]
- [ Kyon,   M, Normal             ]
END
testdata = Hash.create_with(:name, :gender, :role) { arrays }

p testdata[0]  #=> {:gender=>"F", :role=>"Brigade Leader", :name=>"Haruhi"}

I hope this helps your Ruby life.

That's all for now. This article brought to you by The Plant, makers of Joblet, PiqShare,

and many other fine web apps and content management systems.

Pick up our RSS feed while you are here.