Ruby OptionParser 空开关 "-"行为

标签 ruby optionparser

编辑:

我编写了使用 OptionParser 优雅地处理命令行输入的代码。我面临着两个重大打击。

  1. 传递空开关“-”不会产生错误。当然,有些程序认为这是有效的,但我的程序不应该。
  2. 该程序需要两次强制切换,但它毫无怨言地接受了一次切换!例如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/

相关文章:

ruby - 无法使用 OptionParser 和 rspec

Haskell - 从任一数据类型生成缺少参数错误消息

ruby-on-rails - 如何通过在 Ruby 中传递一个 block 来拯救?

ruby - 使用 for 循环将数字相加

ruby - 如何生成 OptionParser 需要参数

ruby - 为什么当我在命令行参数中使用 # 时此命令会失败?

ruby - 在 Nokogiri CSS 选择器中指定图像宽度和/或高度的范围

ruby - 如何在 nanoc 中创建 'draft' 项?

ruby-on-rails - 在 Rails 中使用回形针设置原始图像的路径?