web-dev-qa-db-fra.com

Différences de boucle dans Ruby en utilisant Range vs. Times

J'essaie de résoudre un problème Project Euler en utilisant Ruby, j'ai utilisé 4 méthodes de bouclage différentes, la méthode for-loop, les temps, la plage et jusqu'à, mais la méthode times ne produit que la réponse attendue, tandis que la boucle pour, la plage et jusqu'à la méthode ne fonctionne pas. Je suppose qu'ils sont un peu les mêmes, mais j'ai découvert que ce n'est pas le cas. Quelqu'un peut-il expliquer les différences entre ces méthodes?

Voici la structure en boucle que j'ai utilisée

# for-loop method
for n in 0..1
  puts n
end

0
1
=> 0..1

# times method
2.times do |n|
  puts n
end

0
1
=> 2

# range method
(0..1).each do |n|
  puts n
end

0
1
=> 0..1

# upto method
0.upto(1) do |n|
  puts n
end

0
1
=> 0
27
jbjuly

Ces informations peuvent être facilement obtenues en consultant la documentation.

Array#each a une signature de array.each {|item| block } → array, Donc nous pouvons voir que la valeur de retour de foo.each { ... } Est foo.

De même, Int#upto a une signature de int.upto(limit) {|i| block } => int, de sorte que x.upto(y) { ... } renverra toujours x.

Ensuite, nous pouvons également voir que 2.times { ... } Renverra 2 à cause de la signature de Integer#times .

J'ai du mal à trouver la bonne documentation, mais for x in y... Est traduit en y.each do |x| ..., C'est pourquoi votre boucle for-in renvoie la même chose que votre boucle .each.

Quoi qu'il en soit, en fonction des valeurs de retour de ces constructions en boucle, c'est ... une approche étrange. Je ne pense pas que cela se produise beaucoup (du tout?) Dans le code idiomatique Ruby.

8
Mark Rushakoff

Si je vous ai bien compris, vous demandez pourquoi n.times Est la seule méthode qui répète jusqu'à, mais n'inclut pas n. Dans ce cas:

Pour les plages, c'est simple: x..y Définit une plage de x à y inclus et x...y Définit une plage de x à y exclusif. Donc, si vous voulez le même comportement que fois, utilisez 0...n.

Pour x.upto(y), il n'y a qu'une seule version qui va itérer jusqu'à et y compris y. C'est simplement la façon dont Upto est défini et documenté pour fonctionner.

Il est également assez clair pourquoi n.times N'inclut pas n: s'il itère de 0 à n (inclus), il produira n+1 Fois. Mais comme la méthode est appelée n.times, Elle ne devrait clairement donner que n fois.

3
sepp2k