22

我正在使用OptionParserRuby。

在其他语言(如 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
4

3 回答 3

45

只需将-h键添加到ARGV,当它为空时,您可以执行以下操作:

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!
于 2013-12-16T06:35:11.160 回答
0

我的脚本恰好需要 2 个 args,所以我ARGV.length在解析后使用此代码进行检查:

if ARGV.length != 2 then
  puts optparse.help
  exit 1
end
于 2021-03-19T19:01:49.260 回答
-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 的强制性 args 所做的(找不到任何内置功能):

    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     
    
于 2016-03-30T08:35:10.233 回答