From: Robert Klemme Date: 2008-04-25T06:20:04+09:00 Subject: Re: Question about array.each{|x| delete x} On 24.04.2008 11:56, Peņa wrote: > From: Frisco Del Rosario [mailto:frisco@appleisp.netNO] > # "why isn't it 1 2 3 one three 1 3?". > > a delete (of some element) on an array will really be deleted, ergo, the elements will rearrange/move to logically occupy that deleted space. > > eg, > b=[1,2,3,4,5] > #=> [1, 2, 3, 4, 5] > b.delete 2 > #=> 2 > b > #=> [1, 3, 4, 5] > > also, array#delete(obj) will delete all elements eql to obj. see below. > now, if you combine these behaviours while walking the array itself, expect some surprises if you're not ready :) > > maybe if you show the index, ruby can help you, eg > > a=[1,2,3,1,1,4] > #=> [1, 2, 3, 1, 1, 4] > a.each_with_index{|x,i| a.delete x if x==1; puts "#{i} -> #{x}"} > 0 -> 1 > 1 -> 3 > 2 -> 4 > #=> [2, 3, 4] > > > # What if I wanted to make it so? > > there are many better ways, but i will just modify your sample, > > myArray = [1, 2, 3] > puts myArray > myArray.delete 2 #here i delete 2 first > myArray.each {|x| > if x == 1 > then puts "one" > elsif x == 3 > then puts "three" > end > } > puts myArray > > 1 > 2 > 3 > one > three > 1 > 3 > > kind regards -botp > Well, you can as well do myArray = [1, 2, 3] puts myArray myArray.delete_if {|x| if x == 1 then puts "one" elsif x == 2 then true elsif x == 3 then puts "three" end } puts myArray Note, this works because puts returns nil. :-) But I'd prefer using case myArray.delete_if do |x| case x when 1 puts "one" when 2 true when 3 puts "three" end end Cheers robert