OptionParse без аргументов show banner

Я использую OptionParser с Ruby.

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!

Вопросы

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

Ответ 1

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

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!

Ответ 2

  • Вы можете либо проверить ARGV перед разбором (как ответ выше):
    ARGV << '-h' if ARGV.empty?

    Или проверьте хэш-настройки параметров после разбора:

    if @options.empty?
      puts optparse.help
      puts 'At least 1 argument should be supplied!'
    end
    
  • Это то, что я делаю для обеспечения обязательных аргументов с помощью 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