2010-12-15 151 views
2

J'ai eu une pensée et jusqu'ici la pensée a échoué donc je voulais la partager et la faire corriger.Ruby - Exécution d'une itération en appelant require 'filename'

J'ai une série de scripts Ruby écrits pour parcourir un site de commerce électronique depuis l'ajout au panier jusqu'à la sortie. Les scripts se réfèrent tous les uns aux autres afin de maintenir la chaîne en mouvement. Ce que je veux faire est de faire un fichier Ruby appelé Run_CheckOut.rb mais être capable de parcourir plusieurs itérations de la caisse en invoquant ce fichier x fois.

Voici était mon premier essai:

i = 0 
10.times do 
    i+= 1 
    puts "Iteration number: " + i.to_s 
    require 'Test_OrderService_SubmitCart' 
end 

Quand je fais cela, il va appeler uniquement une fois que le fichier requis, mais continue de compter pour i. Comment puis-je appeler le fichier requis 10 fois ou suis-je complètement hors de la base avec cela?

+1

juste pour vous faire savoir, '10.times do | i |' vous permettra d'utiliser 'i' dans la boucle, en commençant par 0 et en passant par 9. (L'intérieur de votre boucle fonctionnera de la même façon, mais alors vous n'avez pas besoin de déclarer le «i» en dehors de la boucle.) –

Répondre

2

Vous recherchez load (notez que vous devez ajouter .rb):

load 'Test_OrderService_SubmitCart.rb' 

Contrairement à load, require exécute un fichier source une seule fois. Voir la description détaillée de ce que fait require dans le reference documentation.

+0

Bingo !! Je vous remercie! – r3nrut

+0

'load' demandera à Ruby de recharger le fichier à chaque fois, mais cela corrige seulement un petit problème dans ce qui est une mauvaise pratique de programmation. Recharger le fichier pour que le code s'exécute à plusieurs reprises est tout simplement faux. –

4

suis-je complètement hors base avec cela?

Oui. Ce que je veux faire est de faire un fichier Ruby appelé Run_CheckOut.rb mais être capable de parcourir plusieurs itérations de la caisse en invoquant ce fichier x fois. Le point require est de rendre le code disponible pour votre environnement d'exécution. require ne tire qu'une fois le code - l'appeler à nouveau n'a aucun effet. load exécutera le script inclus à chaque fois, mais c'est un mauvais choix de conception.

Ce que vous voulez, c'est d'appeler quelque chose dans le fichier de code source. Peut-être souhaitez-vous appeler une méthode ou créer un objet à partir d'une classe. Définir une méthode:

def do_something 
    # blah blah 
end 

exigent le fichier en haut de votre script:

require 'Test_OrderService_SubmitCart' 

et invoquer la méthode dans la boucle:

i = 0 
10.times do 
    i+= 1 
    puts "Iteration number: " + i.to_s 
    do_something 
end 
+0

C'est une bien meilleure solution. – Chuck

+0

C'est pour un seul script. Je cherche un moyen de déclencher globalement plusieurs scripts avec des dépendances et d'exécuter des itérations des scripts. Il peut y avoir juste un défaut de conception complet avec la façon dont je l'ai mis en place. – r3nrut

0

Il y a aussi une convention ruby nommer les fichiers et les méthodes - en minuscules et soulignés. Les noms de classes et de modules sont en chameau. Ces deux conventions ne sont jamais mélangées.

Votre code final devrait ressembler à quelque chose comme:

require 'order_service' 
10.times do |n| 
    puts "iteration #{n}" 
    submit_cart 
end 

avis de la beauté.

Bonne chance!

+0

Je suis d'accord mais mon patron m'a demandé d'utiliser un étui de chameau puisque je travaille dans un magasin .net. Ce n'est pas à moi mais merci pour l'info. – r3nrut