2011-01-11 8 views
1

Je voudrais savoir s'il existe une façon élégante d'implémenter une boucle pour la méthode suivante. Je ne peux pas venir avec une boucle while (programmeur Java) comme pseudo-code suivant:Le moyen le plus intelligent et le plus efficace d'implémenter une boucle dans Ruby

while x<10  
    search = Google::Search::Web.new() 
    search.query = "china" 
    search.start = x 
end 

Quelqu'un connaît une meilleure façon?

+1

Il y a quelque chose qui cloche avec ce psedocode. Vous ne changez jamais «x» n'importe où. Donc, si x <10 à la boucle commence, la boucle va s'exécuter à l'infini. Si x> = 10 au début de la boucle, il ne fonctionnera pas du tout. –

+0

Google :: Search :: Web ne semble pas avoir d'attribut de début. https://github.com/visionmedia/google-search/blob/master/lib/google-search/search/base.rb –

+0

J'ai personnalisé la bibliothèque. J'aurais dû ajouter une déclaration qui change la valeur de X. Merci à tous! – mabounassif

Répondre

2

Voulez-vous dire quelque chose comme ça?

(1..9).each do |i| 
    search = Google::Search::Web.new() 
    search.query = "china" 
    search.start = i 
end 

Cela exécutera la requête avec démarrage à 1, puis commencer à 2, tout le chemin jusqu'à commencer à 9. La syntaxe 1..9 est une gamme, inclusive des deux côtés.

MISE À JOUR: Le (1..9).each est probablement la façon la plus idiomatiques de le faire en ruby, mais Jonas Elfström a posté un lien cool qui démontre rapidement des alternatives:

http://alicebobandmallory.com/articles/2010/06/21/a-simple-loop

9

De nombreuses alternatives:

# Will go 0..9 
10.times do |i| 
    search = Google::Search::Web.new() 
    search.query = "china" 
    search.start = i 
end 

# Will go 1..10 
1.upto(10) do |i| 
    search = Google::Search::Web.new() 
    search.query = "china" 
    search.start = i 
end 

# Will go 1..10 
(1..10).each do |i| 
    search = Google::Search::Web.new() 
    search.query = "china" 
    search.start = i 
end 
+2

Encore plus d'alternatives http://alicebobandmallory.com/articles/2010/06/21/a-simple-loop –

0
10.times do |i| 
    search = Google::Search::Web.new() 
    search.query = "china" 
    search.start = x 
loop 

Les entiers ont la méthode times qui prend un bloc et boucle n fois re n est le nombre.

0

Puisqu'il ne semble pas que la valeur de x ne change jamais, il y a deux façons possibles de réécrire ceci. Avant que la boucle commence x >= 10, il ne sera jamais exécuté, et il peut simplement être remplacé par rien. Dans le cas contraire, il est une boucle infinie, et la façon la plus idiomatiques d'écrire qui est

loop do 
    search = Google::Search::Web.new 
    search.query = 'china' 
    search.start = x 
end 

Si vous ne connaissez pas la valeur de x avance, vous pouvez simplement faire la boucle conditionnelle:

loop do 
    search = Google::Search::Web.new 
    search.query = 'china' 
    search.start = x 
end if x < 10 

Si x est un envoi de message dont la méthode change sa valeur de retour, alors je ne vois pas de moyen évident d'améliorer votre code autre que de supprimer les accolades superflues.

Questions connexes