红宝石OptionParser空开关“ - ”行为(Ruby OptionParser empty

2019-06-23 10:14发布

编辑:

我已经写了使用OptionParser优雅地处理命令行输入代码。 我现在面临两个主要命中。

  1. 传递空开关“ - ”不给错误。 当然,有些程序把它看作有效的,但我不应该。
  2. 该程序需要两个强制性交换机,但它接受一个开关没有抱怨! 例如program.ruby -f foo -b bar是有效的输入和两个开关都必需。 但只提供一个开关通过没有问题,这是不期望的行为。

对于第一种情况,我做到了这一点:

opts.on('-', /\A-\Z/) do
  $stderr.print "Invalid empty switch"
  exit 1
end

它工作正常。 但是,这是做的正确方法?

对于第二种情况,我看了看周围的OptionParser.new块内的解决方案,但我找不到一个。 例如

unless options.foo && options.bar
  puts "Error."
  exit 2
end

这样做的OptionParser.new块外面是正常的方式?

Answer 1:

如果你正在使用OptionParser,那么,你需要明确禁止空值开关和手动检查所需的参数。

但是,如果用于选项解析,另一种工具如德芬克特的宝石的选择 ,你可以根据需要和无效的选项(如空值开关)将导致打印的帮助和应用程序退出标记选项。 据我所知,在某些情况下,它使得使用OptionParser更有意义,但我个人更喜欢使用更方便的工具,在那里 。

尽管制作所需的选项是很容易的一种方式或其他的,我建议你通过认为你的API的决定。 多少个命令行工具你知道,那些需要的选项? 还有就是为什么命令行通常分为选项和参数,使用前者通常是可选的,通常需要后者的理由。 我会坚持到建立规则。



Answer 2:

我认为,雷神(https://github.com/wycats/thor)可以更有效地解决问题。



文章来源: Ruby OptionParser empty switch “-” behavior