ブログ

A helper method to create a lot of Hash objects

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.

以上、The Plantがお届けしました。
The Plantでは様々なウェブアプリケーションや
コンテンツマネジメントシステムもお届けしています。


RSSの登録はこちらから! RSS feed