如何处理RubyOptionParser中缺少的强制性参数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

在OptionParser中,我可以选择一个选项,但是如果我忽略该值,它会将任何以下选项的名称作为该值,从而搞砸了命令行解析的其余部分。下面是一个测试用例,它回显了选项的值:

$ ./test_case.rb --input foo --output bar
output  bar
input  foo

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

$ ./test_case.rb --input  --output bar
input  --output

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

这里是测试用代码:

#!/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
提问于
用户回答回答于

试试这个:

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

opts.on("-h", "--help", "Show this message") do 
  puts opts
  exit
end


begin
  ARGV << "-h" if ARGV.size != 2   
  option_parser.parse!(ARGV)
rescue OptionParser::ParseError
  $stderr.print "Error: " + $! + "\n"
  exit
end
用户回答回答于

你想做什么不是一个好主意。如果你真的有一个名为“--output”的文件呢?这是Unix上完全有效的文件名。每个Unix程序的选项解析都是按照你所做的ruby的方式工作的,所以你不应该改变它,因为那么你的程序将与任何其他的东西都是任意的不同,这是混淆的,并且违反了“最少惊喜的原则”。

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

./test_case.rb --input "" --output "bar"

然后 - 输入将是空白的,这很容易检测。

另请注意,如果--input设置为--output(并且--output不是真实文件),则可以尝试打开--input文件。如果失败,请输出一条消息,如:

can't open input file: --output: file not found

扫码关注云+社区