HI --

On Fri, 30 Nov 2007, Sharon Phillips wrote:

>
> On 30/11/2007, at 10:51 PM, Jari Williamsson wrote:
>
>> How do I (in an elegant way) delete an element of an array within a block, 
>> while using a block iterator?
> I assume using delete_if is no good in this situation?
> [1,2,3,4,5,6].delete_if{|i| i>4}
>> [1,2,3,4]
>
>> 
>> 
>> The code below won't work (the wanted behavior here is to get all array 
>> elements to print and but also delete the 2nd element after it has been 
>> encountered):
>> ---
>> arr = [1,2,3,4]
>> arr.each_with_index { |e, i|
>> p e
>> arr.delete_at(i) if i == 1
>> }
>> ---
>> results in:
>> 1
>> 2
>> 4
> This is interesting, because although the results printed on the screen imply 
> the 3 was removed, if you look at the array afterthe operation you'll see it 
> was the 2 removed (as we wanted)
>
> irb(main):013:0> (a=[1,2,3,4]).each_with_index{|e,i| p e;a.delete_at(i) if 
> i==1}
> 1
> 2
> 4
> => [1, 3, 4]
>
> I've no ideas why

First time through:

   a => [1,2,3,4]
   e => 1
   i => 0

Second time through:

   a => [1,2,3,4]
   e => 2
   i => 1

Third time through:

   a => [1,3,4]
   e => 4       # i.e., a[2]
   i => 2

Or some such thing. Of course the best idea is never to do this :-)


David

-- 
Upcoming training by David A. Black/Ruby Power and Light, LLC:
    * Intro to Rails, London, UK, December 3-6 (by Skills Matter)
See http://www.rubypal.com for details and 2008 announcements!