Utilizzo di OptionParser per analizzare i comandi in Ruby

Nell'articolo che discute le funzionalità di OptionParser abbiamo discusso alcuni dei motivi che rendono preferibile utilizzare OptionParser in Ruby per guardare manualmente attraverso ARGV per analizzare manualmente i comandi. Ora è il momento di imparare come usare OptionParser e le sue funzionalità.

Il seguente codice boilerplate verrà utilizzato per tutti gli esempi in questa esercitazione. Per provare uno qualsiasi degli esempi, basta semplicemente inserire gli esempi opts.on blocco accanto al commento TODO. L'esecuzione del programma stamperà lo stato delle opzioni e di ARGV, consentendoti di esaminare gli effetti dei tuoi switch.

#! / usr / bin / env ruby
richiede 'optparse'
richiede 'pp'
# Questo hash conterrà tutte le opzioni
# analizzato dalla riga di comando da
# OptionParser.
opzioni =
optparse = OptionParser.new do | opts |
# TODO: inserisci qui le opzioni della riga di comando
# Questo visualizza la schermata di aiuto, tutti i programmi lo sono
# si presume che abbia questa opzione.
opts.on ('-h', '--help', 'Visualizza questa schermata')
mette opts
Uscita
fine
fine
# Analizza la riga di comando. Ricorda che ci sono due forme
# del metodo di analisi. Il metodo 'parse' analizza semplicemente
# ARGV, mentre "analizza!" il metodo analizza l'ARGV e lo rimuove
# qualsiasi opzione trovata lì, così come qualsiasi parametro per
# le opzioni. Ciò che resta è l'elenco dei file da ridimensionare.
optparse.parse!
pp "Opzioni:", opzioni
pp "ARGV:", ARGV

Switch semplice

Un semplice switch è un argomento senza moduli opzionali o parametri. L'effetto sarà semplicemente impostare una bandiera nell'hash delle opzioni. Nessun altro parametro verrà passato a su metodo.

opzioni [: semplice] = falso
opts.on ('-s', '--simple', "Argomento semplice")
opzioni [: semplice] = vero
fine

Passa con parametro obbligatorio

Gli switch che accettano un parametro devono solo indicare il nome del parametro nella forma lunga dello switch. Per esempio, "-f", "--file FILE" indica che l'opzione -f o --file accetta un singolo parametro chiamato FILE e questo parametro è obbligatorio. Non è possibile utilizzare -f o --file senza passare anche un parametro.

opzioni [: mand] = ""
opts.on ('-m', '--mandatory FILE', "Argomento obbligatorio") do | f |
opzioni [: mand] = f
fine

Passa con parametro opzionale

I parametri di commutazione non devono essere obbligatori, possono essere facoltativi. Per dichiarare un parametro switch facoltativo, inserire il nome tra parentesi nella descrizione dello switch. Per esempio, "--logfile [FILE]" significa che il parametro FILE è facoltativo. Se non fornito, il programma assumerà un valore predefinito sano, come un file chiamato log.txt.

Nell'esempio, il linguaggio a = b || c viene usato. Questa è solo una scorciatoia per "a = b, ma se b è falso o nullo, a = c".

opzioni [: opt] = false
opts.on ('-o', '--optional [OPT]', "Argomento opzionale") do | f |
opzioni [: opt] = f || "Niente"
fine

Converti automaticamente in float

OptionParser può convertire automaticamente l'argomento in alcuni tipi. Uno di questi tipi è Float. Per convertire automaticamente i tuoi argomenti in uno switch in Float, passa Float a su metodo dopo le stringhe di descrizione dello switch.

Le conversioni automatiche sono utili. Non solo ti risparmiano il passaggio per convertire la stringa nel tipo desiderato, ma controllano anche il formato per te e genereranno un'eccezione se formattata in modo errato.

opzioni [: float] = 0.0
opts.on ('-f', '--float NUM', Float, "Converti in float") do | f |
opzioni [: float] = f
fine

Alcuni altri tipi che OptionParser può convertire per includere automaticamente Time e Integer.

Elenchi di argomenti

Gli argomenti possono essere interpretati come elenchi. Questo può essere visto come la conversione in un array, mentre sei convertito in Float. Mentre la tua stringa di opzioni può definire il parametro da chiamare "a, b, c", OptionParser consentirà ciecamente un numero qualsiasi di elementi nell'elenco. Quindi, se hai bisogno di un numero specifico di elementi, assicurati di controllare tu stesso la lunghezza dell'array.

opzioni [: elenco] = []
opts.on ('-l', '--list a, b, c', Array, "Elenco dei parametri") do | l |
opzioni [: elenco] = l
fine

Insieme di argomenti

A volte ha senso limitare gli argomenti a un passaggio a poche scelte. Ad esempio, il seguente parametro prenderà solo un singolo parametro obbligatorio e il parametro deve essere uno di , no o può essere. Se il parametro è qualcos'altro, verrà generata un'eccezione.

Per fare ciò, passare un elenco di parametri accettabili come simboli dopo le stringhe di descrizione dello switch.

opzioni [: set] =: sì
opts.on ('-s', '--set OPT', [: yes,: no,: forse], "Parametri da un set") do | s |
opzioni [: set] = s
fine

Moduli negati

Gli switch possono avere una forma negata. L'interruttore --negata può avere uno che fa l'effetto opposto, chiamato --no-negato. Per descriverlo nella stringa di descrizione dello switch, posizionare la parte alternativa tra parentesi: --[No-] negata. Se viene rilevato il primo modulo, true verrà passato al blocco e false verrà bloccato se viene rilevato il secondo modulo.

opzioni [: neg] = false
opts.on ('-n', '- [no-] negated', "Forme negate") do | n |
opzioni [: neg] = n
fine