poiché il each
itera con gli indici e si sta eliminando un elemento nel numero interno loop
ogni altro elemento nella successiva iterazione. se aumenti il numero di elementi e includi l'indice corrente dell'iterazione nel ciclo, potrai vedere l'immagine più grande.
arr = [1,2,3,4,5,6,7,8,9]
arr.each_with_index do |x,ix|
puts "loop1: #{arr.inspect}, x: #{x}, ix: #{ix}"
arr.each_with_index do |y, iy|
puts "loop2: #{arr.inspect}, y: #{y}, iy: #{iy}"
puts "#{arr.delete(y)}"
end
end
risultato
loop1: [1, 2, 3, 4, 5, 6, 7, 8, 9], x: 1, ix: 0
loop2: [1, 2, 3, 4, 5, 6, 7, 8, 9], y: 1, iy: 0
1
loop2: [2, 3, 4, 5, 6, 7, 8, 9], y: 3, iy: 1
3
loop2: [2, 4, 5, 6, 7, 8, 9], y: 5, iy: 2
5
loop2: [2, 4, 6, 7, 8, 9], y: 7, iy: 3
7
loop2: [2, 4, 6, 8, 9], y: 9, iy: 4
9
loop1: [2, 4, 6, 8], x: 4, ix: 1
loop2: [2, 4, 6, 8], y: 2, iy: 0
2
loop2: [4, 6, 8], y: 6, iy: 1
6
=> [4, 8]
poiché si elimina durante il ciclo e dopo ogni iterazione l'indice viene incrementato ma la matrice è un elemento breve, quindi, elimina il successivo (e tutti i) corrispondente elemento (s) disponibile e alla fine il ciclo confronta e ferma il ciclo quando index >= length
si prega di approvare risposta appropriata – bronislav
@bronislav, dargli un po 'di tempo. È passata solo un'ora. Non c'è fretta. –
@CarySwoveland, spiacente – bronislav