Ruby OptionParser布尔选项的短代码吗?

时间:2019-02-07 15:35:35

标签: ruby boolean flags optparse optionparser

我正在使用Ruby的OptionParser(require 'optparse')处理可能为true或false的“详细”选项。就是这样的代码:

  parser.on('-v', '--[no-]verbose', 'Verbose mode') do |v|
    self.verbose = v
  end

我支持在环境变量中指定选项(我将其内容添加到ARGV),因此可以在该环境变量中设置详细模式,并在命令行上使用--no-verbose覆盖它。但是,我找不到用短选项覆盖它的方法。我尝试过这些没有成功:

-v-
-v0
-v=0

我在https://github.com/ruby/ruby/blob/trunk/lib/optparse.rb找到了源代码,但从中找不到答案。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

基于https://github.com/ruby/ruby/blob/trunk/lib/optparse.rb#L1936-L1949并考虑到-v标志对于大多数命令的工作方式,以下内容应该起作用:

  • -v -与您尝试的类似,但有空格
  • -v no
  • -v false

修改

发表评论后,我进一步研究了问题并亲自进行了尝试。这就是我最终得到的:

# optparser.rb

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.on("-v", "--[no-]verbose [FLAG]", TrueClass, "Run verbosely") do |v|
    options[:verbose] = v.nil? ? true : v
  end
end.parse!

p options

OP对代码进行的重要更改是:

  • 添加[FLAG]“参数”。这将为该选项启用参数,例如-v no-v yes-v false-v true-v n-v y-v + (我没有使-v -正常工作)。
  • 添加显式argument coercion TrueClass。没有它,该参数将被解释为字符串(例如'false')。
  • 通过将参数定义包装在[ ]中,然后通过v.nil? ? true : v确保将true设置为默认值,从而将参数设置为可选。如果不使用大括号,则参数解析器将不接受-v(不带参数)

答案 1 :(得分:0)

在布尔标志(例如n)之后直接放置-vn会将其设置为false。此示例打开然后关闭详细的布尔标志,然后打印数字1:

rexe -mn -v -vn 1