From: Rolando Abarca Date: 2008-07-21T02:40:58+09:00 Subject: Re: [QUIZ] Records and Arrays (#170) my solution (including a simple test) require 'ostruct' require 'test/unit' # solution by rolando abarca - funkaster@gmail.com module Quiz170 def self.aor_to_roa(arr) os = OpenStruct.new arr.each do |o| # another way to get the keys: # keys = (o.methods - OpenStruct.new.methods).delete_if { |m| m.match(/=$/) } o.instance_variable_get("@table").keys.each { |k| (os.send(k).nil? ? os.send("#{k}=", []) : os.send(k)) << o.send(k) } end os end def self.roa_to_aor(rec) arr = [] table = rec.instance_variable_get("@table") size = table[table.keys.first].size 0.upto(size-1) { |i| obj = OpenStruct.new table.keys.each { |k| obj.send("#{k}=", table[k][i]) } arr << obj } arr end end class TestQuiz170 < Test::Unit::TestCase def setup @data = [] 1.upto(100) { |i| _t = OpenStruct.new _t.name = "t#{i}" _t.data = (rand * 1000).round @data << _t } @roa = Quiz170.aor_to_roa(@data) end def test_001 1.upto(100) { idx = (rand * 100).to_i assert_equal @data[idx].name, @roa.name[idx] assert_equal @data[idx].data, @roa.data[idx] } end def test002 assert_equal @data, Quiz170.roa_to_aor(@roa) end end regards, rolando./