On Aug 17, 2005, at 9:41 AM, EdUarDo wrote: > Hi all, I have this code: > > > class Test > def testA > home_squad = home.squad.to_a > ########################################### > # Could improve this? > ########################################### > for i in 0...11 > home.tactic.set_player(i, home_squad[i][0]) > end > end > end > > class Tactic > def set_player(counter_id, player_id) > @counters[counter_id].player_id = player_id > end > end > > Having that home.squad is a Hash object, and @counters an Array, > is there an easy way to do what I'm trying to do? > > In loop for of testA method I want to change the player_id > attribute of > objects contained in @counters array. Could I define an iterator to > simplify > the sentence? Here's one thought: class Test def testA home_squad = home.squad.to_a home_squad.each_with_index do |squad, i| home.tactic.set_player(i, squad.first) end end end class Tactic def set_player(counter_id, player_id) @counters[counter_id].player_id = player_id end end Another idea it to expose the @counters from Tactic: class Test def testA home_squad = home.squad.to_a.map { |e| e.first } home.tactic.counters.each { |c| c.player_id = home_squad.shift } end end class Tactic attr_reader :counters end Or, you could delegate the iteration: class Test def testA home_squad = home.squad.to_a.map { |e| e.first } home.tactic.players { |c| c.player_id = home_squad.shift } end end class Tactic def players( &block ) @counters.each(&block) end end Hope that gives you some new ideas. James Edward Gray II