Loop improvement

(EdUarDo) #1

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?

(James Edward Gray II) #2

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

···

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?

(EdUarDo) #3

James Edward Gray II wrote:

Hope that gives you some new ideas.

All are good ideas. Sometimes I need to cry because of my rigid brain :(,
well, I think I need more experience with Ruby.

(EdUarDo) #4

        home_squad = home.squad.to_a.map { |e| e.first }

Which is the e's class?

(Brian Schröder) #5

You could ask ruby for an answer:

        home_squad = home.squad.to_a.map { |e| p e.class; e.first }

should give you the answer (multiple times even :wink:

regards,

Brian

···

On 17/08/05, EdUarDo <eduardo.yanezNOSPAM@nospamgmail.com> wrote:

> home_squad = home.squad.to_a.map { |e| e.first }

Which is the e's class?

--
http://ruby.brian-schroeder.de/

Stringed instrument chords: http://chordlist.brian-schroeder.de/

(James Edward Gray II) #6

Whatever the class of home_squad[n] is. map() just walks the Array, replacing the elements.

It looked like an Array to me, by the way you were using it.

James Edward Gray II

···

On Aug 17, 2005, at 10:11 AM, EdUarDo wrote:

        home_squad = home.squad.to_a.map { |e| e.first }

Which is the e's class?