Ruby Language
OptionParser
Ricerca…
introduzione
OptionParser può essere utilizzato per l'analisi delle opzioni da riga di comando da ARGV
.
Opzioni della riga di comando obbligatorie e facoltative
È relativamente semplice analizzare la riga di comando a mano se non si sta cercando qualcosa di troppo complesso:
# Naive error checking
abort('Usage: ' + $0 + ' site id ...') unless ARGV.length >= 2
# First item (site) is mandatory
site = ARGV.shift
ARGV.each do | id |
# Do something interesting with each of the ids
end
Ma quando le opzioni cominciano a diventare più complicate, probabilmente dovrai usare un parser di opzioni come, beh, OptionParser :
require 'optparse'
# The actual options will be stored in this hash
options = {}
# Set up the options you are looking for
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{$0} -s NAME id ..."
opts.on("-s", "--site NAME", "Site name") do |s|
options[:site] = s
end
opts.on( '-h', '--help', 'Display this screen' ) do
puts opts
exit
end
end
# The parse! method also removes any options it finds from ARGV.
optparse.parse!
C'è anche un parse
non distruttiva, ma è molto meno utile se ARGV
utilizzare il resto di ciò che è in ARGV
.
La classe OptionParser non ha un modo per applicare gli argomenti obbligatori (come --site
in questo caso). Tuttavia, puoi eseguire il controllo dopo aver eseguito il parse!
:
# Slightly more sophisticated error checking
if options[:site].nil? or ARGV.length == 0
abort(optparse.help)
end
Per un gestore di opzioni obbligatorie più generico, vedere questa risposta . Nel caso in cui non sia chiaro, tutte le opzioni sono opzionali a meno che non si facciano il possibile per renderle obbligatorie.
Valori standard
Con OptionsParser
, è davvero facile impostare valori predefiniti. Basta precompilare l'hash in cui si memorizzano le opzioni in:
options = {
:directory => ENV['HOME']
}
Quando definisci il parser, sovrascrive il valore predefinito se un utente fornisce un valore:
OptionParser.new do |opts|
opts.on("-d", "--directory HOME", "Directory to use") do |d|
options[:directory] = d
end
end
Descrizioni lunghe
A volte la tua descrizione può diventare piuttosto lunga. Per esempio irb -h
elenca sull'argomento che legge:
--context-mode n Set n[0-3] to method to create Binding Object,
when new workspace was created
Non è immediatamente chiaro come supportarlo. La maggior parte delle soluzioni richiede la regolazione per rendere l'indentazione della seconda e delle seguenti linee allineata alla prima. Fortunatamente, il metodo on
supporta più righe descrittive aggiungendole come argomenti separati:
opts.on("--context-mode n",
"Set n[0-3] to method to create Binding Object,",
"when new workspace was created") do |n|
optons[:context_mode] = n
end
Puoi aggiungere tutte le linee di descrizione che desideri per spiegare completamente l'opzione.