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]
Este mismo efecto ocurre con el otro iterador array, k.each:¿Solución limpia a este truco de iterador de rubí?
k = [1,2,3,4,5]
k.each do |n|
puts n
if n == 2
k.delete(n)
end
end
puts k.join(",")
tiene la misma salida.
La razón por la que esto está sucediendo es bastante clara ... Ruby en realidad no itera a través de los objetos almacenados en la matriz, sino que simplemente lo convierte en un iterador de índice de matriz bonito, comenzando en el índice 0 y aumentando cada vez índice hasta que se acabe. Pero cuando elimina un elemento, aún aumenta el índice, por lo que no evalúa el mismo índice dos veces, lo que yo quiero.
Esto podría no ser lo que está sucediendo, pero es lo mejor que se me ocurre.
¿Hay una manera limpia de hacer esto? ¿Ya hay un iterador incorporado que pueda hacer esto? ¿O tendré que ensuciarlo y hacer un iterador de índice de matriz, y no incrementarlo cuando se elimine? (O se puede recorrer un clon de la matriz, y eliminar de la matriz original)
Aclaración
Yo simplemente no quiero eliminar elementos de una matriz; lo siento si eso estuvo claro. Lo que me gustaría hacer es iterar a través de cada elemento y "procesarlo"; este proceso a veces puede eliminarlo. Para ser más precisos:
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, quisiera que todos los artículos en tracking_array fueran procesados.
Cuando se quita Living_Thing de tracking_array, se debe llamar a Living_Thing # die ; do_stuff_to_die limpia las cosas que tienen que clasificarse.
es esto para una aplicación Rails o simplemente Ruby? – Anurag
esto es para Ruby puramente –