Question

Je suis en train de ramasser ruby par le portage d'une taille moyenne (non OO) programme perl.Une de mes expressions idiomatiques est de définir des options comme ceci:

use Getopt::Std;
our $opt_v;  # be verbose
getopts('v');
# and later ...
$opt_v && print "something interesting\n";

En perl, j'ai un peu de grain à mes dents et laissez $opt_v être (efficacement) mondial.

En ruby,plus ou moins équivalent exact serait

require 'optparse'
    opts.on("-v", "--[no-]verbose", TrueClass, "Run verbosely") {
        |$opt_verbose|
    }
    opts.parse!
end

où $opt_verbose mondial est que les classes peuvent avoir accès.Avoir des classes de connaître les indicateurs globaux comme ça en a l'air ...euh ...mal.Quel est le OO-idiomatiques façon de faire cela?

  • Laissez la routine principale de prendre soin de toutes les options liées à des trucs et ont les classes juste retour des choses qu'il décide de la façon de traiter?
  • Avoir des classes en œuvre facultatif comportement (par exemple, savoir-être commentaires) et définir un mode via un attr_writer genre de chose?

mise à jour: Merci pour les réponses suggérant optparse, mais j'aurais été plus clair qu'il n'est pas comment pour traiter les options de ligne de commande je demande, mais plus la relation entre les options de ligne de commande de manière efficace de définir un programme global de l'état et des classes qui, idéalement, devrait être indépendant de ce genre de chose.

Était-ce utile?

La solution

Un temps, j'ai couru à travers ce blog (par Todd Werth) qui ont présenté une assez longue carcasse pour les scripts de ligne de commande en Ruby.Son squelette utilise une approche hybride dans lequel le code de l'application est encapsulé dans une classe d'application qui est instancié, puis exécuté en appelant à un "run" de la méthode sur l'objet application.Cela a permis aux options pour être stocké dans une large classe de variable d'instance, de sorte que toutes les méthodes de l'objet application peut accéder sans les exposer à de tout autres objets qui pourraient être utilisés dans le script.

Je pencherais vers l'utilisation de cette technique, où les options sont contenues dans un objet et utiliser attr_writers ou l'option paramètres sur les appels de méthode pour passer les options pertinentes pour les autres objets.De cette façon, tout le code contenu dans des classes externes peuvent être isolés à partir des options elles-mêmes, pas besoin de s'inquiéter à propos de la dénomination des variables dans la routine principale de l'intérieur de la thingy classe si vos options sont définies avec une thingy.verbose=true attr_writer ou thingy.process(true) appel.

Autres conseils

L' optparse la bibliothèque fait partie de la distribution standard, de sorte que vous serez en mesure de l'utiliser sans exiger d'un tiers des trucs.

Je ne l'ai pas utilisé personnellement, mais rails semble beaucoup l'utiliser et donc ne rspec, qui je pense est assez solide vote de confiance

Cet exemple de rails script/console semble montrer comment l'utiliser assez facilement et agréablement

L' tout d'abord frappé sur google pour "le traitement des options de ligne de commande en ruby"un article sur Gourgandine ce qui semble être un bon outil pour ce travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top