2012-05-01 13 views
16

Come impostare un offset iniziale per il ciclo each in rubino? Voglio che il ciclo inizi da a[3] anziché a[0]. Come posso impostarlo?Ruby - ogni offset iniziale

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

a.each do |i| 
#some stuff 
end 

risposta

34

altro, possibilmente possibilità più diretta e leggibile è quella di utilizzare Array#drop:

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

Ora questo brilla davvero se combinato con altri metodi ereditati da Enumerable, quindi è probabile che ci sia un'alternativa migliore al tuo imperativo ciclo each. Dire che si desidera filtrare la fetta estratto e trasformarlo in seguito:

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

o dire che si desidera stampare un elenco di tutti i valori:

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

uscita:

4 
5 

Questi le caratteristiche ereditate dalla programmazione funzionale sono ciò che rende Ruby così forte :)

+0

Quali linguaggi di programmazione funzionali hanno influenzato questo stile di programmazione? – Vass

+1

@Vass In LISP e in seguito in Haskell che fanno molto affidamento su liste permanenti collegate singolarmente, questo stile è piuttosto comune (ad esempio troverete le classiche funzioni 'map',' filter', 'take',' drop', 'zip' ecc. che si trova anche nel modulo 'Enumerable' di Ruby) –

+0

Sarebbe bello vedere una varietà di questi metodi come drop, mentre si implementa la ricerca binaria o qualche altro algoritmo di ordinamento – Donato

19

Uso each su una subpart della matrice. Nell'esempio riportato di seguito, a partire dal quarto elemento alla fine:

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

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

4

Questo vi aiuterà di

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

La maggior parte Rubyist dimenticare il buon vecchio ciclo for:

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

Perché fa schifo, in quanto non introduce un nuovo ambito, che è contro-intuitivo in quanto utilizza 'do/end'. Inoltre, OP voleva elencare gli elementi dell'array, non gli indici. –

+0

Eh? Ognuno usa anche do/end? Se si desidera un nuovo ambito, non utilizzare la chiusura del processo, utilizzare una chiamata al metodo all'interno del ciclo. Se c'è una differenza principale tra e per quanto riguarda il loro blocco di codice, mi piacerebbe saperlo (anche io sottovaluto per i loop :) –

+1

In ogni caso, ho aggiunto un [i] invece di i al codice, grazie. –