k = [1,2,3,4,5]
for n in k
puts n
if n == 2
k.delete(n)
end
end
puts k.join(",")
# Result:
# 1
# 2
# 4
# 5
# [1,3,4,5]
# Desired:
# 1
# 2
# 3
# 4
# 5
# [1,3,4,5]
Questo stesso effetto accade con l'altro iteratore matrice, k.each:Soluzione pulita per questo trucco furioso iteratore?
k = [1,2,3,4,5]
k.each do |n|
puts n
if n == 2
k.delete(n)
end
end
puts k.join(",")
ha la stessa uscita.
Il motivo per cui questo accade è abbastanza chiaro ... Ruby non esegue iterazione degli oggetti archiviati nell'array, ma piuttosto lo trasforma in un iteratore di indice piuttosto array, a partire dall'indice 0 e aumentando ogni volta il valore. indice fino a quando non è finita. Ma quando elimini un oggetto, esso incrementa comunque l'indice, quindi non valuta lo stesso indice due volte, il che lo voglio.
Questo potrebbe essere non essere quello che sta succedendo, ma è il meglio che riesco a pensare.
C'è un modo pulito per farlo? C'è già un iteratore integrato che può farlo? O dovrò sporcarlo e fare un iteratore di indice di array, e non incrementare quando l'elemento viene cancellato? (O di scorrere un clone della matrice, ed eliminare dalla matrice originale)
Chiarimento
non mi vogliono semplicemente eliminare gli elementi da un array; scusa se era chiaro. Quello che vorrei fare è iterare attraverso ogni elemento e "processarlo"; questo processo potrebbe talvolta cancellarlo. Per essere più precisi:
class Living_Thing
def initialize tracker,id
@tracker = tracker
@id = id
@tracker << self
end
def process
do_stuff
puts @id
if @id == 2
die
end
end
def die
do_stuff_to_die
@tracker.delete(self)
end
def inspect
@id
end
end
tracking_array = Array.new()
foo = Living_Thing.new(tracking_array,1)
bar = Living_Thing.new(tracking_array,2)
rab = Living_Thing.new(tracking_array,3)
oof = Living_Thing.new(tracking_array,4)
puts tracking_array.join(",") # => [1, 2, 3, 4]
for n in tracking_array
n.process
end
# result: only foo, bar, and oof are processed
Idealmente, vorrei tutti gli elementi in tracking_array da lavorare.
Quando Living_Thing viene rimosso da tracking_array, Living_Thing # die deve essere chiamato; do_stuff_to_die pulisce le cose che devono essere raggruppate.
è questo per un'applicazione Rails o solo Ruby? – Anurag
questo è per Ruby puramente –