In message "[ruby-list:18833] delete array member inside each block"
    on 99/11/23, Kikutani Makoto <kikutani / galaxy.net> writes:

>たとえば、「整数の配列の偶数メンバーだけ消す」みたいのは
>
>a = [1, 2, 3, 4, 5, 6, 7]
>a.each {|n| a.delete(n) if n % 2 == 0}
>p a
>
>で [1, 3, 5, 7] が返るんで、期待どおりになりますよね。
>if n % 2 == 1 にして奇数だけ消そうと思えば [2, 4, 6]
>が返るので、これもOK。
>
>んが、条件をなくして全部消そうとして
>a.each {|n| a.delete(n)}
>にしても [2, 4, 6] が返る理由が説明できませぬ。

実装的には、こういうことでしょう:

% cat each-test.rb
class Array
  def each
    i = 0
    while i < size
      elm = self[i]
      print "i=#{i}; a[i]=#{elm}: BEFORE: a = #{self.inspect}\n" # debug print
      yield elm
      print "             AFTER:  a = #{self.inspect}\n"         # debug print
      i += 1
    end
  end
end
a = [1, 2, 3, 4, 5, 6, 7]
a.each{|n| a.delete(n)}
% ruby each-test.rb
i=0; a[i]=1: BEFORE: a = [1, 2, 3, 4, 5, 6, 7]
             AFTER:  a = [2, 3, 4, 5, 6, 7]
i=1; a[i]=3: BEFORE: a = [2, 3, 4, 5, 6, 7]
             AFTER:  a = [2, 4, 5, 6, 7]
i=2; a[i]=5: BEFORE: a = [2, 4, 5, 6, 7]
             AFTER:  a = [2, 4, 6, 7]
i=3; a[i]=7: BEFORE: a = [2, 4, 6, 7]
             AFTER:  a = [2, 4, 6]

とりあえず delete_if を使うというのでどうでしょう??

a.delete_if{|n| n % 2 == 0} #=> [1, 3, 5, 7]
a.delete_if{|n| n % 2 == 1} #=> [2, 4, 6]
a.delete_if{|n| n }         #=> []
a.delete_if{}               #=> [1, 2, 3, 4, 5, 6, 7]

-- gotoken