【问题标题】:How to generate OptionParser require arguments如何生成 OptionParser 需要参数
【发布时间】:2013-05-18 07:23:05
【问题描述】:

下面的代码有效,但是当我想将所需参数构建到所需参数的本机 OptionParser 语法中时,我使用 fetch 手动引发所需参数的参数错误:

# ocra script.rb -- --type=value
options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("--type [TYPE]",String, [:gl, :time], "Select Exception file type (gl, time)") do |t|
    options["type"] = t
  end

  opts.on("--company [TYPE]",String, [:jaxon, :doric], "Select Company (jaxon, doric)") do |t|
    options["company"] = t
  end

end.parse!

opts = {}
opts['type'] = options.fetch('type') do
  raise ArgumentError,"no 'type' option specified  as a parameter (gl or time)"
end

opts['company'] = options.fetch('company') do
  raise ArgumentError,"no 'company' option specified  as a parameter (doric or jaxon)"
end

【问题讨论】:

  • 我发现"--type [TYPE]"表示TYPE是可选的,而"--type TYPE"表示TYPE是必需的。所以不要键入括号 f(ಠ‿↼)z

标签: ruby optionparser


【解决方案1】:

有一个类似的问题,其答案可能对您有所帮助: "How do you specify a required switch (not argument) with Ruby OptionParser?"

简而言之:似乎没有办法使选项成为必需(毕竟它们被称为选项)。

您可以引发 OptionParser::MissingArgument 异常,而不是当前抛出的 ArgumentError

【讨论】:

【解决方案2】:

面对同样的情况,我最终得到了这样的选择。如果没有提供我的所有强制选项,请根据我定义的选项输出由OptionParser 生成的用户友好的帮助文本。感觉比抛出异常并向用户打印堆栈跟踪更干净。

options = {}
option_parser = OptionParser.new do |opts|
  opts.banner = "Usage: #{$0} --data-dir DATA_DIR [options]"

  # A non-mandatory option
  opts.on('-p', '--port PORT', Integer, 'Override port number') do |v|
    options[:port] = v
  end

  # My mandatory option
  opts.on('-d', '--data-dir DATA_DIR', '[Mandatory] Specify the path to the data dir.') do |d|
    options[:data_dir] = d
  end
end

option_parser.parse!

if options[:data_dir].nil?
  puts option_parser.help
  exit 1
end

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 2013-08-29
    • 2010-12-05
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多