出野です。

> a = [1, 2, 3, 4, 5, 6, 7]
> a.each {|n| a.delete(n)}

eachでまわしつつも、同時に配列aの中身を
変更させているからでしょう。

つまり、
1. 最初に 'n' に *0* 番目の '1' が入る。
2. この '1' を配列a より削除。
3. この操作により配列a は [2,3,4,5,6,7] となる。
4. このため次に 'n' に入るのは、'2' ではなく
   *1* 番目の '3' ということになり・・・
5. 以後繰り返し。