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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow