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.
