2013-12-16 17 views
12

Używam Ruby z OptionParser.OptionParse bez argumentów pokaż banner

W innych językach, takich jak C, Python itp., Istnieją podobne parsery parametrów wiersza polecenia i często umożliwiają wyświetlanie komunikatu pomocy, gdy nie podano parametrów lub parametry są nieprawidłowe.

options = {} 
OptionParser.new do |opts| 
    opts.banner = "Usage: calc.rb [options]" 

    opts.on("-l", "--length L", Integer, "Length") { |l| options[:length] = l } 
    opts.on("-w", "--width W", Integer, "Width") { |w| options[:width] = w } 

    opts.on_tail("-h", "--help", "Show this message") do 
    puts opts 
    exit 
    end 
end.parse! 

Pytania:

  1. Czy istnieje sposób ustawić, że domyślnie pokazują help wiadomość jeśli parametry nie zostały przekazane (ruby calc.rb)?
  2. Co się stanie, jeśli wymagany parametr nie zostanie podany lub będzie nieprawidłowy? Załóżmy, że length jest parametrem WYMAGANE i użytkownik nie przekazuje go lub nie przekazuje czegoś nieprawidłowego, np. -l FOO?
+7

dodać to: 'ARGV.push ('H') - jeśli ARGV .empty? 'before parsing –

+0

@ МалъСкрелевъ, tak, było, dziękuję! – Israel

+0

Czy moja odpowiedź była pomocna? =) –

Odpowiedz

23

Użytkownik może zrobić coś takiego:

require 'optparse' 

ARGV << '-h' if ARGV.empty? 

options = {} 
OptionParser.new do |opts| 
    opts.banner = "Usage: calc.rb [options]" 

    opts.on("-l", "--length L", Integer, "Length") { |l| options[:length] = l } 
    opts.on("-w", "--width W", Integer, "Width") { |w| options[:width] = w } 

    opts.on_tail("-h", "--help", "Show this message") do 
    puts opts 
    exit 
    end 
end.parse! 
-1
  1. Można też sprawdzić ARGV przed parsowania (jako odpowiedź powyżej):
    ARGV << '-h' if ARGV.empty?

    Albo sprawdzić hash opcji po przeanalizowaniu:

    if @options.empty? 
        puts optparse.help 
        puts 'At least 1 argument should be supplied!' 
    end 
    
  2. To co mam zrobić, aby zapewnić obowiązkowe args z OptionParse (nie znaleziono żadnej wbudowaną funkcję dla tego):

    begin 
        optparse.parse! 
        mandatory = [:length, :width]           # Enforce the presence of 
        missing = mandatory.select{ |param| @options[param].nil? }   # mandatory switches: :length, :width 
        if not missing.empty?             # 
         puts "Missing options: #{missing.join(', ')}"     # 
         puts optparse.help            # 
         exit 2               # 
        end                 # 
    rescue OptionParser::InvalidOption, OptionParser::MissingArgument => error  # 
        puts error                 # Friendly output when parsing fails 
        puts optparse                # 
        exit 2                  # 
    end  
    
Powiązane problemy