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