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