布尔选项的 Ruby OptionParser 短代码?

Kei*_*ett 4 ruby flags boolean optparse optionparser

我正在使用 Ruby 的 OptionParser ( require 'optparse') 处理一个“详细”选项,该选项可以是 true 也可以是 false。它在代码中是这样的:

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

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

-v-
-v0
-v=0
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

ulf*_*rts 6

基于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
Run Code Online (Sandbox Code Playgroud)

OP 对代码的重要更改是:

  • 添加[FLAG]“参数”。这将为-v no, -v yes, -v false, -v true, -v n, -v y, 之类的选项启用一个参数-v +(我没有得到-v -工作)。
  • 添加显式参数强制 TrueClass。没有它,参数将被解释为字符串(例如'false')。
  • 通过将参数定义包装在其中[ ],然后确保 true 被视为默认值,从而将参数变为可选v.nil? ? true : v。没有大括号,参数解析器不接受-v(没有参数)