2012-05-01 8 views
16

¿Cómo configuro un desplazamiento inicial para each loop en ruby? Quiero que el ciclo comience desde a[3] en lugar de a[0]. ¿Cómo configuro eso?Ruby: cada desplazamiento inicial

a = [ab, cd, ef, gh, hi, jk] 

a.each do |i| 
#some stuff 
end 

Respuesta

34

Otro, posibilidad posiblemente más directa y legible es usar Array#drop:

a.drop(3).each do |i| 
    # do something with item i 
end 

Ahora esto realmente brilla si se combina con otros métodos heredados de Enumerable, por lo que es probable que exista una mejor alternativa a su imperativo each bucle. Digamos que usted quiere filtrar el corte extraído y transformarla después:

a = [0,1,2,3,4,5,6,7] 
a.drop(3).select(&:even?).map { |x| x * 2 } 
# => [8, 12] 

O supongamos que desea imprimir una lista de todos los valores:

a = ["1", "2", "3", "4", "5"] 
puts a.drop(3).join("\n") 

Salida:

4 
5 

Estos características heredadas de la programación funcional son las que hacen que Ruby sea tan fuerte :)

+0

¿Qué lenguajes de programación funcionales influyeron en este estilo de programación? – Vass

+1

@Vass En LISP y luego Haskell, que dependen en gran medida de las listas persistentes vinculadas individualmente, este estilo es bastante común (por ejemplo, encontrarás allí las funciones clásicas 'map',' filter', 'take',' drop', 'zip' etc. que también encontrará en el módulo 'Enumerable' de Ruby) –

+0

Sería bueno ver una variedad de estos métodos como drop, mientras implementa la búsqueda binaria o algún otro algoritmo de clasificación – Donato

19

Uso each en un subpart de la matriz. En el siguiente ejemplo, a partir del cuarto elemento al final:

a[3..-1].each do |i| 
    #some stuff 
end 
+0

a [a.size - 1] .each do | i | – JohnMerlino

4

Esto le ayudará de

a[3..-1].each do |i| 
    #your logic 
end 
3

más Rubyist olvidar el buen viejo de bucle:

n = 3 
for i in n...a.size 
    puts a[i] 
end 
+4

Porque es una mierda, ya que no introduce un nuevo ámbito, que es contrario a la intuición, ya que utiliza 'do/end'. Además, OP quería enumerar los elementos de la matriz, no los índices. –

+0

¿Eh? ¿Cada uno también usa do/end? Si desea un nuevo alcance, no use el cierre de proc, use una llamada a un método dentro del ciclo. Si hay una diferencia principial entre for y each en cuanto a su bloque de código, me gustaría saberlo (también infrautilizo los bucles :) –

+1

De todos modos, agregué un [i] en lugar de i al código, Gracias. –

Cuestiones relacionadas