From: John Joyce Date: 2007-10-17T06:15:44+09:00 Subject: Re: big array, problems with deleting all empty items On Oct 16, 2007, at 11:40 AM, Robert Klemme wrote: > On 15.10.2007 20:38, Konrad Meyer wrote: >> Quoth Robert Klemme: >>> On 15.10.2007 19:41, Simon Schuster wrote: >>>> it seems that I have to run it a couple different times for it to >>>> work.. array.length = 16576, if that could be a potential >>>> problem. if >>>> it is, how do I work around it? >>>> >>>> 077:0> array = File.read("/text.txt").to_a.each { |x| x.chomp! } >>>> 080:0> array.each_with_index { |x,y| >>>> array.delete_at(y) if x.empty? == true >>>> } >>>> >>>> still leaves me with plenty of empty array items >>>> 080:0> array[-3] >>>> "" >>> Your bug is in the loop: you iterate and delete at the same time >>> which will likely yield strange results (as you observe). Why >>> don't you just do >>> >>> array.delete_if {|x| x.empty?} >>> >>> Btw, empty? == true is quite dangerous because in Ruby "true" is >>> not the only valid value for true. >> But !!e.empty? == true will do the trick :D. > > I've seen the smiley but, frankly, I find this only moderately > funny. The reason is that there are too many people around that > think comparing boolean values is a great idea. This is at least > superfluous and often outright dangerous. Other people then will > have to debug those bugs... > > Cheers > > robert > Well, in this case it may be just naive. In many languages you might have to do something like that. No big deal. Comparing a boolean method to a boolean value will only ever return a boolean. Can't go wrong. If it is set up right it could be convenient if there is a chance of a nil value, because nil == true returns false. But the condition is still in .empty?