【问题标题】:Ruby OptionParser empty switch "-" behaviorRuby OptionParser 空开关“-”行为
【发布时间】:2012-04-19 17:21:31
【问题描述】:

已编辑:

我编写的代码使用 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 块中四处寻找解决方案,但找不到。例如

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

在 OptionParser.new 块之外做是正常的方式吗?

【问题讨论】:

  • 好的,我会在这里进行更正,因为我正在尝试解决这个问题。为了让空开关正常工作,我使用了opts.on('-', /\A-\Z/),它只在满足正则表达式后才进入块。
  • 是的,我不确定这是怎么发生的,因为我在探索问题并不断完善解决方案时实际上已经进行了编辑。如何让版主重定向/删除这个?
  • 由于另一个没有答案,您可能希望删除那个。或者单击问题下方(以及这些 cmets 上方)的“标记”链接,然后进行相应操作。

标签: ruby optionparser


【解决方案1】:

如果您使用的是OptionParser,那么是的,您需要明确禁止空开关并手动检查所需参数。

但是,如果您使用其他工具进行选项解析,例如defunkt's gem choice,您可以将选项标记为必填项,无效选项(例如空开关)将导致打印帮助并退出应用程序。我知道在某些情况下使用 OptionParser 更有意义,但我个人更喜欢使用 the more convenient tools out there

尽管以某种方式设置所需的选项非常容易,但我建议您仔细考虑您的 API 决策。您知道多少命令行实用程序,它们具有必需的选项?命令行通常分为选项和参数是有原因的,前者通常是可选的,而后者通常是必需的。我会坚持既定的惯例。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果你的意思是建造得非常好,那么当然,它建造得非常好。
    猜你喜欢
    • 2014-10-20
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多