编辑:
我编写了使用 OptionParser 优雅地处理命令行输入的代码。我面临着两个重大打击。
- 传递空开关“-”不会产生错误。当然,有些程序认为这是有效的,但我的程序不应该。
- 该程序需要两次强制切换,但它毫无怨言地接受了一次切换!例如
program.ruby -f foo -b bar
是有效输入,两个开关都是 :REQUIRED。但仅提供一个开关就可以顺利通过,这不是所需的行为。
对于第一种情况,我这样做了:
opts.on('-', /\A-\Z/) do
$stderr.print "Invalid empty switch"
exit 1
end
它工作正常。但这是正确的做法吗?
对于第二种情况,我在 OptionParser.new block 中四处寻找解决方案,但找不到。例如
unless options.foo && options.bar
puts "Error."
exit 2
end
在 OptionParser.new block 之外进行是正常的方法吗?
最佳答案
如果您使用的是 OptionParser,那么是的,您需要明确禁止空开关并手动检查所需的参数。
但是,如果您使用其他工具进行选项解析,例如 defunkt's gem choice ,您可以将选项标记为必需,无效选项(例如空开关)将导致打印帮助并退出应用程序。我知道在某些情况下使用 OptionParser 更有意义,但我个人更喜欢使用 the more convenient tools out there .
尽管使选项成为必需选项非常简单,但我还是建议您仔细考虑您的 API 决策。您知道有多少命令行实用程序具有必需的选项?命令行通常分为选项和参数是有原因的,前者通常是可选的,而后者通常是必需的。我会坚持既定的惯例。
关于Ruby OptionParser 空开关 "-"行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037762/