2013-12-16 1 views
12

Я использую OptionParser с Ruby.OptionParse без аргументов показывать баннер

I другие языки, такие как C, Python и т. Д., Существуют аналогичные синтаксические анализаторы параметров командной строки, и они часто предоставляют способ отображения справочного сообщения, когда параметры не заданы или параметры не соответствуют действительности.

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. Есть ли способ, чтобы установить, что по умолчанию показывает help сообщения, если параметры не были приняты (ruby calc.rb)?
  2. Как насчет того, если требуемый параметр не указан или недействителен? Предположим, что length является параметром REQUIRED, и пользователь не передает его или передает что-то не так, как -l FOO?
+7

добавить следующее: 'ARGV.push («- Н»), если ARGV .путь? 'перед разбором –

+0

@ МалъСкрылевъ, да, это было, спасибо! – Israel

+0

ответили утвердительно? знак равно –

ответ

23

Вы можете сделать что-то вроде этого:

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. Вы можете проверить ARGV перед разбором (как выше ответ):
    ARGV << '-h' if ARGV.empty?

    Или проверить хеш опций после разбора:

    if @options.empty? 
        puts optparse.help 
        puts 'At least 1 argument should be supplied!' 
    end 
    
  2. Это то, что я сделать, чтобы обеспечить обязательные арг с OptionParse (не удалось найти какой-либо встроенной функции для этого):

    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  
    
Смежные вопросы