2016-06-22 41 views
10

come posso iterare su un array di rubino e sempre ottenere due valori, la corrente e l'altro, come:Iterate a coppie attraverso una serie rubino

[1,2,3,4,5,6].pairwise do |a,b| 
    # a=1, b=2 in first iteration 
    # a=2, b=3 in second iteration 
    # a=3, b=4 in third iteration 
    # ... 
    # a=5, b=6 in last iteration 
end 

mio caso d'uso: Voglio verificare se una matrice è ordinato e avendo un iteratore come questo potrei sempre confrontare due valori.

io non sono alla ricerca di each_slice come in questa domanda: Converting ruby array to array of consecutive pairs

risposta

18

Stai cercando each_cons:

(1..6).each_cons(2) { |a, b| p a: a, b: b } 
# {:a=>1, :b=>2} 
# {:a=>2, :b=>3} 
# {:a=>3, :b=>4} 
# {:a=>4, :b=>5} 
# {:a=>5, :b=>6} 
+2

Sì, questo è esattamente quello che mi serve! Ho esaminato [Enumerable] (http://ruby-doc.org/core-2.1.0/Enumerable.html) e [Enumerator] (http://ruby-doc.org/core-2.1.0/Enumerator. html) ma non l'ho visto. Thx – Andi

+2

@Andi e riguardo il tuo caso d'uso: 'ary.each_cons (2) .all? {| a, b | a <= b} 'restituisce' true' se i valori sono ordinati. (sfortunatamente, non puoi usare 'all? (&: <=)' qui a causa del modo in cui 'each_cons' produce i valori) – Stefan