------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--