[Q] how to do insertion and smooth traversal simultaneously on array

as Robert said:

···

-----------------------------------------------------------------
a = [ 0, 1, 2, 3, 4, 5 ]
actions =
a.each_with_index do |x, i|
  puts "[#{i}] : #{x}"
  if i % 2 == 0 # even index ?
    actions << [a, :insert, [i, ':-)']]
  end
end
# do it!
actions.reverse.each{|action| action[0].send(action[1], *action[2])}
puts a.size
------------------------------------------------------------------

[0] : 0
[1] : 1
[2] : 2
[3] : 3
[4] : 4
[5] : 5
9

cheers

Simon

-----Original Message-----
From: SHIGETOMI, Takuhiko [mailto:tshiget1@gw.nsw.co.jp]
Sent: Tuesday, September 06, 2005 9:32 AM
To: ruby-talk ML
Cc: tshiget1@gw.nsw.co.jp
Subject: [Q] how to do insertion and smooth traversal
simultaneously on array

greetings, guys.

this is a pseudo-ruby code which shows what i am expecting.

a = [ 0, 1, 2, 3, 4, 5 ]
a.each_with_index do |x, i|
  puts "[#{i}] : #{x}"
  if i % 2 == 0 # even index ?
    a.insert( i, ':-)' )
    skip 1 # <- this is a pseudo directive to skip the next element
           # which has just been inserted now
  end
end
puts a.size

expected output...

[0] : 0
[1] : 1
[2] : 2
[3] : 3
[4] : 4
[5] : 5
9 <-- means that 3 smileys have been inserted

as above, i want to traverse an array with some conditional
insertion to
itself.

do anyone know cool way for that?

ttsp://void/3d/universe/milky-way-galaxy/orion-arm/sol-solar-system/
3rd-planet/fareast/jp/tky/shigetomi.takuhiko.5618

Kroeger Simon (ext) wrote:

as Robert said:
-----------------------------------------------------------------
a = [ 0, 1, 2, 3, 4, 5 ]
actions =
a.each_with_index do |x, i|
  puts "[#{i}] : #{x}"
  if i % 2 == 0 # even index ?
    actions << [a, :insert, [i, ':-)']]
  end
end
# do it!
actions.reverse.each{|action| action[0].send(action[1], *action[2])}
puts a.size
------------------------------------------------------------------

You can slightly simplify this as

a = [ 0, 1, 2, 3, 4, 5 ]
actions =
a.each_with_index do |x, i|
  puts "[#{i}] : #{x}"
  if i % 2 == 0 # even index ?
    actions << [a, [:insert, i, ':-)']]
  end
end
# do it!
actions.reverse.each{|obj, args| obj.send(*args)}
puts a.size, "", a

Although I like the idea to use #send in this case a simpler solution
would be sufficient:

a = [ 0, 1, 2, 3, 4, 5 ]
actions =
a.each_with_index do |x, i|
  puts "[#{i}] : #{x}"
  if i % 2 == 0 # even index ?
    actions << [i, ':-)']
  end
end
# do it!
actions.reverse.each{|idx, val| a.insert(idx, val)}
puts a.size, "", a

Kind regards

    robert