Ruby 布尔选项的 OptionParser 短代码?

Ruby OptionParser Short Code for Boolean Option?

我正在使用 Ruby 的 OptionParser (require 'optparse') 处理一个可以为 true 或 false 的 "verbose" 选项。它在代码中是这样的:

  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 找到了源代码,但无法从中找到答案。

我该怎么做?

基于 https://github.com/ruby/ruby/blob/trunk/lib/optparse.rb#L1936-L1949 并考虑到 -v 标志如何适用于大多数命令,以下应该有效:

  • -v - 与您尝试的类似,但带有 space
  • -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] 'argument'。这将为 -v no-v yes-v false-v true-v n-v y-v + 等选项启用参数(我没有让 -v - 工作)。
  • 添加显式 argument coercion TrueClass。没有它,参数将被解释为字符串(例如 'false')。
  • 通过将参数定义包装在 [ ] 中,然后确保通过 v.nil? ? true : v 将 true 视为默认值,从而将参数变为可选。没有大括号,参数解析器不接受 -v(没有参数)

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

rexe -mn -v -vn 1