Question Existe-t-il une version Ruby de for-loop similaire à celle de Java / C ++?


Existe-t-il une version Ruby de for-loop similaire à celle de Java / C (++)?

En Java:

for (int i=0; i<1000; i++) {
    // do stuff
}

La raison en est que je dois effectuer différentes opérations en fonction de l'index de l'itération. On dirait que Ruby a seulement une boucle for-each?

Ai-je raison?


9
2017-12-09 05:32


origine


Réponses:


Oui, vous pouvez utiliser each_with_index

collection = ["element1", "element2"]
collection.each_with_index {|item,index| puts item; puts index}

la variable 'index' vous donne l'index de l'élément à chaque itération


11
2017-12-09 05:39



Ruby a tendance à utiliser des itérateurs plutôt que des boucles; Vous pouvez obtenir toutes les fonctions des boucles avec les puissants itérateurs de Ruby.

Il y a plusieurs choix pour faire cela, supposons que vous ayez un tableau 'arr' de taille 1000.

1000.times {|i| puts arr[i]}
0.upto(arr.size-1){|i| puts arr[i]}
arr.each_index {|i| puts arr[i]}
arr.each_with_index {|e,i| puts e} #i is the index of element e in arr

Tous ces exemples fournissent les mêmes fonctionnalités


15
2017-12-09 09:31



Que diriez-vous step?

0.step(1000,2) { |i| puts i }

est équivalent à:

for (int i=0; i<=1000; i=i+2) {
    // do stuff
}

10
2017-12-09 10:14



En Ruby, le for la boucle peut être implémentée comme:

1000.times do |i|
  # do stuff ...
end

Si vous voulez à la fois l'élément et l'index, le each_with_index la syntaxe est probablement la meilleure:

collection.each_with_index do |element, index|
  # do stuff ...
end

Cependant, le each_with_index la boucle est plus lente car elle fournit à la fois le element et index objets pour chaque itération de la boucle.


5
2017-12-09 06:26



La boucle while exécute son corps zéro ou plusieurs fois tant que sa condition est vraie.

while <condition>
    # do this
end

La boucle while peut remplacer la boucle 'for' de Java. En Java,

for (initialization;, condition;, incrementation;){
    //code 
}

est identique à la suite (sauf que, dans la seconde forme, les variables initialisées ne sont pas locales pour for-loop).

initialization;
for(, condition;, ) {
    //code
    incrementation;
}

La boucle ruby ​​'while' peut être écrite sous cette forme pour fonctionner en boucle de Java. En rubis,

initialization;
while(condition)
    # code
    incrementation;
end 

Notez que la boucle "while" (et "until" et "for") n'introduit pas de nouvelle étendue; les locaux existants peuvent être utilisés dans la boucle, et de nouveaux locaux créés seront disponibles par la suite.


4
2017-07-09 13:58



for i in 0..100 do
  #bla bla
end

2
2018-01-09 22:02



Vous pouvez utilisateur chacun avec index.


1
2017-12-09 05:40



times est recommandé sur each_with_index. times est environ 6 fois plus rapide. Exécutez le code ci-dessous.

require "benchmark"

TESTS = 10_000_000
array = (1..TESTS).map { rand }
Benchmark.bmbm do |results|
  results.report("times") do
    TESTS.times do |i|
      # do nothing
    end
  end

  results.report("each_with_index") do
    array.each_with_index do |element, index|
      # Do nothing
    end
  end
end

J'ai obtenu le résultat ci-dessous avec mon MacBook (Intel Core2Duo).

Rehearsal ---------------------------------------------------
times             1.130000   0.000000   1.130000 (  1.141054)
each_with_index   7.550000   0.210000   7.760000 (  7.856737)
------------------------------------------ total: 8.890000sec

                      user     system      total        real
times             1.090000   0.000000   1.090000 (  1.099561)
each_with_index   7.600000   0.200000   7.800000 (  7.888901)

1
2017-12-09 10:53