4

我正在使用 Ruby 的 OptionParser ( require 'optparse') 处理可以为真或假的“详细”选项。它在这样的代码中:

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

我怎样才能做到这一点?

4

2 回答 2

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

OP 对代码的重要更改是:

  • 添加[FLAG]“论据”。这将为选项启用一个参数,如-v no, -v yes, -v false, -v true, -v n, -v y, -v +(我没有得到-v -工作)。
  • 添加显式参数 coercion TrueClass。没有它,参数将被解释为字符串(例如'false')。
  • 通过将参数定义包装在[ ]其中并确保 true 被视为默认值,从而将参数变为可选v.nil? ? true : v。没有大括号,参数解析器不接受-v(没有参数)
于 2019-02-07T16:16:11.083 回答
0

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

rexe -mn -v -vn 1

于 2019-02-10T04:34:41.780 回答