Frage

Ich bin versucht zu pick up von ruby Portierung medium-sized (non-OO) perl-Programm.Einer meiner persönlichen Idiome ist das festlegen der Optionen wie diese:

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

In perl kann ich meine Zähne zusammenbeißen, und lassen Sie $opt_v werden (effektiv), einem global.

In ruby,die mehr oder weniger genaue Entsprechung wäre

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

wo $opt_verbose ist ein globales, dass Klassen zugreifen können.Mit den Klassen wissen über Globale flags wie scheint ...er ...falsch.Was ist das OO-idiomatischen Weg, dies zu tun?

  • Lassen Sie die main-routine kümmern sich um alle option-bezogene Dinge und haben die Klassen nur Rückkehr es Sie, dass es entscheidet, wie zu deal mit?
  • Klassen implementieren optional Verhalten (z.B., wissen Sie, wie ausführlich sein) und legen Sie einen Modus über ein attr_writer Art der Sache?

aktualisiert: Vielen Dank für die Antworten, die darauf hindeutet, optparse, aber ich hätte klarer, dass es nicht wie zu verarbeiten Kommandozeilen-Optionen, die ich bin Fragen, sondern mehr die Beziehung zwischen Kommandozeilen-Optionen, die effektiv einstellen eines globalen Programms Staat und die Klassen, die im Idealfall unabhängig von, dass Art der Sache.

War es hilfreich?

Lösung

Eine Weile zurück ich lief in diesem blog-Beitrag (von Todd Werth) vorgestellt, die eine ziemlich lange Skelett für Kommandozeilen-Skripte in Ruby.Sein Skelett verwendet einen hybrid-Ansatz, bei dem die Anwendungs-code ist eingekapselt in eine application-Klasse, die instanziiert wird, dann durchgeführt durch den Aufruf der "run" - Methode auf das application-Objekt.Dies erlaubt es, die Optionen werden gespeichert, in einem Klasse-Breite Instanz-Variablen, so dass alle Methoden in das application-Objekt zugreifen kann, ohne dass diese zu anderen Gegenständen, die möglicherweise im Skript verwendet werden.

Ich würde tendieren zu verwenden diese Technik, bei der die Optionen enthalten sind, die in einem Objekt, und verwenden Sie entweder attr_writers bzw. die option Parameter, die auf die Methodenaufrufe an diesbezüglichen Optionen, um zusätzliche Objekte.Auf diese Weise, jeder code, der in externen Klassen isoliert werden können, von den Optionen, die sich-sorgen Sie sich nicht um die Benennung der Variablen in der main-routine aus, die innerhalb der thingy Klasse, wenn Ihre Optionen sind mit ein thingy.verbose=true attr_writer oder thingy.process(true) rufen.

Andere Tipps

Die optparse die Bibliothek ist Teil der standard-distribution, so dass Sie in der Lage sein, es zu verwenden, ohne dass Dritte-party Zeug.

Ich habe nicht verwendet es persönlich, aber Schienen scheint der nutzen es ausgiebig und so funktioniert rspec, ich glaube, das ist schon ein Recht solider Vertrauensbeweis

Dieses Beispiel aus der schiene" script/console scheint zu zeigen, wie es zu benutzen ist ziemlich einfach und schön

Die Erster Treffer auf google nach "die Verarbeitung Kommandozeilen-Optionen in ruby"ist ein Artikel über Trollop das scheint ein gutes Werkzeug für diese Aufgabe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top