Domanda

Sto cercando di acquisire Ruby eseguendo il porting di un programma Perl di medie dimensioni (non OO).Uno dei miei modi di dire personali è impostare opzioni come questa:

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

In Perl, stringo i denti e lascio che $opt_v sia (effettivamente) un globale.

In rubino, l'equivalente più o meno esatto sarebbe

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

dove $opt_verbose è un globale a cui le classi possono accedere.Sembra che il fatto che le classi conoscano le bandiere globali in questo modo...ehm...sbagliato.Qual è il modo OO-idiomatico per farlo?

  • Lasciare che la routine principale si occupi di tutte le cose relative alle opzioni e che le classi restituiscano semplicemente le cose che decide come gestire?
  • Le classi implementano un comportamento opzionale (ad esempio, sanno come essere prolisso) e impostano una modalità tramite una sorta di cosa attr_writer?

aggiornato: Grazie per le risposte che suggeriscono optparse, ma avrei dovuto essere più chiaro sul fatto che non lo è Come per elaborare le opzioni della riga di comando di cui sto chiedendo, ma più la relazione tra le opzioni della riga di comando che impostano effettivamente uno stato globale del programma e le classi che dovrebbero idealmente essere indipendenti da quel genere di cose.

È stato utile?

Soluzione

Qualche tempo fa mi sono imbattuto questo post del blog (di Todd Werth) che presentava uno scheletro piuttosto lungo per gli script da riga di comando in Ruby.La sua struttura utilizza un approccio ibrido in cui il codice dell'applicazione è incapsulato in una classe dell'applicazione di cui viene istanziata, quindi eseguita chiamando un metodo "run" sull'oggetto dell'applicazione.Ciò ha consentito di archiviare le opzioni in una variabile di istanza a livello di classe in modo che tutti i metodi nell'oggetto dell'applicazione possano accedervi senza esporle ad altri oggetti che potrebbero essere utilizzati nello script.

Io propenderei per l'utilizzo di questa tecnica, in cui le opzioni sono contenute in un oggetto e utilizzerei attr_writers o parametri di opzione sulle chiamate al metodo per passare le opzioni pertinenti a eventuali oggetti aggiuntivi.In questo modo, qualsiasi codice contenuto in classi esterne può essere isolato dalle opzioni stesse: non è necessario preoccuparsi della denominazione delle variabili nella routine principale dall'interno della classe. thingy class se le tue opzioni sono impostate con a thingy.verbose=true attr_writer o thingy.process(true) chiamata.

Altri suggerimenti

IL optparse libreria fa parte della distribuzione standard, quindi sarai in grado di usarla senza richiedere materiale di terze parti.

Non l'ho usato personalmente, ma i binari sembrano usarlo ampiamente E lo stesso vale per rspec, che immagino sia un voto di fiducia piuttosto solido

Questo esempio da Rails' script/console sembra mostrare come usarlo abbastanza facilmente e bene

IL primo colpo su Google per "elaborazione delle opzioni della riga di comando in Ruby" è un articolo su Trollop che sembra essere un buon strumento per questo lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top