Ruby: come eseguire l'iterazione su un intervallo, ma con incrementi impostati?


156

Quindi sto ripetendo un intervallo del genere:

(1..100).each do |n|
    # n = 1
    # n = 2
    # n = 3
    # n = 4
    # n = 5
end

Ma quello che mi piacerebbe fare è iterare per 10.

Quindi invece di aumentare ndi 1, il prossimo nsarebbe effettivamente 10, quindi 20, 30, ecc. Ecc.



@DiegoDias ma questo ha il meglio e poi quel thread
Jackson Jegatheesan il

Risposte:



12

È possibile utilizzare Numeric#step.

0.step(30,5) do |num|
  puts "number is #{num}"
end
# >> number is 0
# >> number is 5
# >> number is 10
# >> number is 15
# >> number is 20
# >> number is 25
# >> number is 30

6

Ecco un altro modo forse più familiare per farlo:

for i in (0..10).step(2) do
    puts i
end

10
Siamo spiacenti, ma la guida allo stile ruby ​​scoraggia fortemente i forcicli di utilizzo .
Darth Egregious,

@DarthEgregious perché è quello?
Doug,

È un'estensione della filosofia secondo cui ogni cosa è un oggetto e ogni azione è una chiamata di metodo. Quindi, anziché utilizzare un built-in per il looping for, è necessario utilizzare il eachmetodo
Darth Egregious,

5
rng.step(n=1) {| obj | block } => rng

Esegue l'iterazione su rng, passando ogni ennesimo elemento al blocco. Se l'intervallo contiene numeri o stringhe, viene utilizzato l'ordinamento naturale. Altrimenti il ​​passo invoca succ per scorrere gli elementi dell'intervallo. Il codice seguente utilizza la classe X, definita nella documentazione a livello di classe.

range = Xs.new(1)..Xs.new(10)
range.step(2) {|x| puts x}
range.step(3) {|x| puts x}

produce:

1 x
3 xxx
5 xxxxx
7 xxxxxxx
9 xxxxxxxxx
1 x
4 xxxx
7 xxxxxxx
10 xxxxxxxxxx

Riferimento: http://ruby-doc.org/core/classes/Range.html

......

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.