------ art_5618_9969883.1214346697661 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline On Tue, Jun 24, 2008 at 5:53 PM, Rick DeNatale <rick.denatale / gmail.com> wrote: > > > Well, I haven't dug into the implementation of Array#delete enough to fully > explain the results but. > And having now looked at the Ruby 1.8 implementation of Array#delete, I think I know exactly what's going on. Here's a pseudo-ruby translation of the C code: class Array def delete(obj) i1 2 while i1 < self.length e elf[i1] unless e obj self[i2] i2 + end i1 + end if i2 elf.length # We didn't find any matches return yield(obj) if block_given? else self.length 2 end end def length ) # A method to set the length of the array and make any necessary internal adjustments end end So, you start out with arr array [1, 2, 3, aFoo, 'b'] And then call arr.delete(1) Now lets's step through the delete method i1 i2 self e e 1 Action 0 0 [1, 2, 3, aFoo, 'b'] 1 true so we just increment i1 giving 1 0 [1, 2, 3, aFoo, 'b'] 2 false so we change self[i0] and increment i2 giving 2 1 [2, 2, 3, aFoo, 'b'] 3 false so we change self[i0] and increment i2 giving 3 2 [2, 3, 3, aFoo, 'b'] Foo BANG! this clears $array which is also self which is also arr, since all reference the same object. The state is now: 3 2 [nil, nil, nil, nil] Foo false Foo# returns false so we set self[i2] and increment i2 giving: 4 3 [nil, nil, aFoo, nil] And the loop ends and self.length adjusts things so that self arr $array [nil, nil, aFoo] -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/ ------ art_5618_9969883.1214346697661--