如何在Ruby OptionParser中处理缺少的强制参数?

Rob*_*nes 17 ruby command-line optionparser

在OptionParser中,我可以强制选择一个选项,但是如果我省略该值,它将使用任何后续选项的名称作为值,从而搞砸了命令行解析的其余部分.这是一个回答选项值的测试用例:

$ ./test_case.rb --input foo --output bar
output  bar
input  foo
Run Code Online (Sandbox Code Playgroud)

现在省略第一个选项的值:

$ ./test_case.rb --input  --output bar
input  --output
Run Code Online (Sandbox Code Playgroud)

有没有办法阻止它将另一个选项名称作为值?谢谢!

这是测试用例代码:

#!/usr/bin/env ruby
require 'optparse'
files = Hash.new

option_parser = OptionParser.new do |opts|
  opts.on('-i', '--input FILENAME', 'Input filename - required') do |filename|
    files[:input] = filename
  end
  opts.on('-o', '--output FILENAME', 'Output filename - required') do |filename|
    files[:output] = filename
  end
end

begin
  option_parser.parse!(ARGV)
rescue OptionParser::ParseError
  $stderr.print "Error: " + $! + "\n"
  exit
end

files.keys.each do |key|
  print "#{key}  #{files[key]}\n"
end
Run Code Online (Sandbox Code Playgroud)

ape*_*arr 9

你想做什么不是一个好主意.如果你真的有一个名为"--output"的文件怎么办?这是Unix上完全有效的文件名.每个Unix程序的选项解析都按照ruby的方式进行,所以你不应该改变它,因为那时你的程序将与其他任何东西任意不同,这会让人感到困惑,并且违反了"最少惊喜的原则".

真正的问题是:你为什么首先遇到这个问题?也许你正在从另一个程序运行你的程序,而父程序提供了一个空白文件名作为参数--input,这使得它看到--output作为参数--input.您可以通过始终引用在命令行上传递的文件名来解决此问题:

./test_case.rb --input "" --output "bar"
Run Code Online (Sandbox Code Playgroud)

然后 - 输入将为空白,并且很容易检测到.

另请注意,如果--input设置为--output(并且--output不是真实文件),您可以尝试打开--input文件.如果失败,请打印如下消息:

can't open input file: --output: file not found
Run Code Online (Sandbox Code Playgroud)

这应该让用户清楚他们做错了什么.

  • +1永远不会试图通过用聪明的代码隐藏它来修复某些东西 (3认同)

gle*_*man 1

--output在这种情况下,缺少强制选项,因此请在调用后执行此操作parse!

unless files[:input] && files[:output]
  $stderr.puts "Error: you must specify both --input and --output options."
  exit 1
end
Run Code Online (Sandbox Code Playgroud)