2010-06-30 7 views
1

Je suis en train de boucler à travers de multiples déclarations, mais je veux passer par chacun une fois, par exemple:boucle rubis cas suivant exemple

while count < 5 do 
    count+= (not sure if this how ruby increments counts) 
    puts "In condition one" 
    next if count > 1 
    puts "In condition two" 
    next if count > 1 
    #.. 
end 

Mise à jour 1:

Merci pour la réponse, ce J'essaye de faire une boucle dans un tableau et d'avoir chaque élément du tableau appliqué à 10 conditions différentes. Par exemple: array [a 100 elements] l'élément 1 obtient la condition 1, l'élément 2 passe à la condition 2, et ainsi de suite. Comme il y a 10 conditions, le 11e élément du tableau obtiendrait état 1 à nouveau, et ainsi de suite (condition 1 état 2 état 3 ...)

Mise à jour 2:

Merci encore d'avoir pris la le temps de répondre. Je m'excuse de ne pas être très clair. Le tableau contient des emails. J'ai 10 serveurs de messagerie et je veux envoyer les 200 emails que j'ai dans mon tableau à travers chaque serveur (seulement 1 email par serveur). J'espère que cela a du sens

+1

Désolé, je ne comprends pas ce que vous êtes sont Demander. Pourquoi faire une boucle? –

+0

J'ai un tableau que je veux faire défiler, mais chaque élément du tableau doit passer par une condition différente à chaque fois, puis redémarrer à la première condition. – rahrahruby

+1

Vous devriez éditer votre question pour ajouter plus de détails sur ce que vous essayez réellement de faire. On dirait que vous vous trompez peut-être. – mckeed

Répondre

0

Si je lis bien, vous voulez envoyer un grand nombre d'e-mails par un petit nombre de serveurs tout en équilibrant la charge. Essayez de créer une classe pour gérer les serveurs (voici l'idée de base)

class ServerFarm 
    def initialize 
     @servers = [] 
    end 

    attr_accessor :servers 

    def add_server(server) 
     @servers << server 
    end 

    def remove_server(x) 
     if x.is_a?(Numeric) then 
      @servers.delete_at(x) 
     elsif x.is_a?(Server) 
      @servers.delete(x) 
     end 
    end 

    def server_available? 
     @servers.each {|s| return true if s.available? } 
     false 
    end 

    def dispatch_message(email) 
     @servers.each_with_index {|s, i| 
      next unless s.available? 
      s.dispatch(email) 
      return i 
     } 
     nil 
    end 
end 

Maintenant, tout ce que vous aurez à faire est d'appeler ServerFarm.dispatch_message un email et il sera envoyé en utilisant l'un des serveurs disponibles. Cette classe suppose que vous avez une classe nommée Server qui détient les informations pour vos serveurs individuels, etc etc

+0

. . .attends quoi? –

+0

Ma réponse était en réponse aux mises à jour du PO, qu'il a posté comme commentaires à la réponse d'Adrian au lieu de mettre à jour la question. Je vais modifier la question et les copier pour éviter toute confusion. – bta

+0

Comment cette solution équilibre-t-elle la charge? –

0

Est-ce que cela aide? Je ne peux pas dire ce que vous essayez de faire.

5.times do |count| 
    puts 'In condition ' + %w(one two three four five)[count] 
end 

Le 5.times do |count| va Excecute le bloc cinq fois avec count à partir de zéro et incrémenter chaque fois. %w(one two three four five) est la même que ["one", "two", "three", "four", "five"].

Si vous souhaitez effectuer cinq opérations consécutives, vous n'avez pas besoin de boucle. Il suffit de mettre les déclarations consécutives:

# do thing 1 
# do thing 2 
# do thing 3 
# ... 

Modifier:

«J'ai un tableau que je veux faire une boucle à travers, mais chaque élément du tableau doit passer par une condition différente à chaque fois puis redémarrez à la première condition. "

à boucle à travers un réseau sans fin, tester chaque élément contre les conditions:

arr = ['sdfhaq', 'aieei', 'xzhzdwz'] 

loop do 
    arr.each do |x| 
    case x 
    when /..h/ 
     puts 'There was a \'h\' at the third character.' 
    when /.{6}/ 
     puts 'There were at least six characters.' 
    else 
     puts 'None of the above.' 
    end 
    end 
end 

Edit 2:

« Merci pour la réponse, ce que je suis en train de faire est une boucle à travers un array et que chaque élément du tableau est appliqué à 10 conditions différentes, exemple: array [a 100 elements] l'élément 1 obtient la condition 1 l'élément 2 passe à la condition 2 et ainsi de suite, puisqu'il y a 10 conditions le 11ème élément du tableau recevrait à nouveau la condition 1 et ainsi de suite condition 1 condition 2 condition "

Vous devrez utiliser la méthode % pour les nombres.

arr = Array.new(130) # an array of 130 nil elements. 
num_conditions = 10 

arr.each_with_index do |x, i| 
    condition = (i + 1) % num_conditions 
    puts "Condition number = #{condition}" 
end 

Plus d'informations: http://ruby-doc.org/core/classes/Fixnum.html#M001059

Modifier trois:

def send_an_email(email, server) 
    puts "Sending an email with the text #{email.inspect} to #{server}." 
end 

email_servers = ['1.1.1.1', '2.2.2.2'] 
emails = ['How are you doing?', 'When are you coming over?', 'Check out this link!'] 

emails.each_with_index do |email, i| 
    send_an_email email, email_servers[i % email_servers.length] 
end 

Vous pouvez modifier email_servers et emails et avoir encore du travail, même si les longueurs sont changées.

+0

Merci pour la réponse, ce que j'essaie de faire est de boucler un tableau et d'avoir chaque élément du tableau appliqué à 10 conditions différentes, exemple: tableau [a 100 éléments] élément 1 obtient condition 1 élément 2 passe à la condition 2 et ainsi de suite, puisqu'il y a 10 conditions, le 11ème élément du tableau obtiendrait à nouveau la condition 1 et ainsi de suite. condition 1 condition 2 condition 3 – rahrahruby

+0

Merci encore d'avoir pris le temps de répondre. Je m'excuse de ne pas être très clair. Le tableau contient des courriels, j'ai 10 serveurs de courriel et je veux envoyer les 200 courriels que j'ai dans mon tableau à travers chaque serveur (seulement 1 courriel par serveur). J'espère que cela à du sens. – rahrahruby

+0

Si cette dernière édition vous a aidé du tout, pourriez-vous cliquer sur l'icône en forme de coche en haut de ma réponse? Je serai toujours heureux d'aider. Merci. :) – Adrian

0
array = (1..100).to_a 
conditions = (1..10).to_a 

array.each_with_index do |elem, i| 
    puts "element %d, using condition %d" % [elem, conditions[i % conditions.length]] 
end 

produit

element 1, using condition 1 
element 2, using condition 2 
element 3, using condition 3 
element 4, using condition 4 
element 5, using condition 5 
element 6, using condition 6 
element 7, using condition 7 
element 8, using condition 8 
element 9, using condition 9 
element 10, using condition 10 
element 11, using condition 1 
element 12, using condition 2 

etc. 
+0

Merci pour votre réponse. C'était très utile! – rahrahruby

0
array.each_slice(10) do |emails| 
    servers.zip(emails) { |server,email| server<<email } 
end 

(Ruby 1.9.2)