2010-08-19 3 views
1

Je voudrais faire quelque chose comme ceci à partir d'un script Ruby, dans une boucle:Quelle est la meilleure façon d'exécuter un programme Ruby à partir d'un programme Ruby?

  1. Ecrire un a.rb fichier (qui change chaque itération)
  2. système execute (ruby de a.rb ')
  3. a.rb écrit une chaîne avec des résultats à
  4. les finitions a.rb 'résultats d'un fichier et Ruby retourne « true » (en supposant aucune erreur)
  5. le script appelant lit et prend des mesures « résultats » du fichier .

Je m'attends à ce qu'il existe de nombreuses façons de le faire. Par exemple, au lieu de l'étape # 2- # 5, est-ce que je pourrais simplement charger 'a.rb' (dans la boucle) et invoquer l'une de ses méthodes? Existe-t-il un meilleur moyen d'utiliser eval() ou autre chose? (Obtenir une compréhension de métaprogrammation est sur ma liste Ruby to-do.)

+0

Question connexe: [Exécution d'un autre script ruby ​​à partir d'un script ruby] (http://stackoverflow.com/questions/2635108/running-another-ruby-script-from-a-ruby-script) –

+0

Pourquoi avez-vous besoin 'a.rb' du tout? Pourquoi n'avez-vous pas votre script principal écrire lui-même le fichier 'results'? D'où vient le code que vous écrivez à 'a.rb'? Est-ce que ce doit être une chaîne, ou peut-être le code de votre script principal? –

+0

Merci, Mladen. Désolé d'avoir pris tant de temps pour revenir. Le programme principal construit des programmes Ruby (en boucle), qu'il stocke dans un tableau de chaînes (ou une longue chaîne). Il doit ensuite diriger Ruby pour exécuter chacun de ces programmes. Le fichier de résultats était simplement un moyen de force brute pour que chacun des programmes construits renvoie ses résultats au programme principal. –

Répondre

3

Je pense que eval est probablement la bonne solution pour le code généré dynamiquement; C'est pour ça que c'est conçu. Au lieu de créer a.rb du tout, juste eval('some-code-that-would-be-in-a.rb').

+0

Wow, c'était rapide! Borealid, voulez-vous dire que l'argument d'eval est une seule chaîne contenant tout le code, avec \ n à la fin de chaque ligne de code? Je m'attendrais à avoir le code dans un tableau de chaînes, bien que je puisse bien sûr convertir cela en une seule chaîne. –

+0

@Cary Swoveland: La taille d'un bloc donné à 'eval' dépend de ce que vous essayez de faire - la" granularité "de votre tâche. Généralement, vous devriez essayer de minimiser le nombre d'appels distincts à 'eval' que vous faites. – Borealid

+0

Je vois beaucoup de façons de casser le rubis globalement, donc utilisez eval uniquement pour le code de confiance. – akostadinov

Questions connexes