下面的代码可行,但是当我想在本机OptionParser sytax中为所需参数构建所需参数时,我会使用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
答案 0 :(得分:12)
有一个类似的问题,答案可能对您有所帮助: “How do you specify a required switch (not argument) with Ruby OptionParser?”
简而言之:似乎没有办法让选项成为必需(毕竟它们被称为选项)。
您可以提出OptionParser::MissingArgument
例外,而不是您当前正在投掷的ArgumentError
。
答案 1 :(得分:0)
面对同样的情况,我最终遇到了这样的选择。如果没有提供我所有的强制性选项,请根据我定义的选项输出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