红宝石OptionParser短码布尔选项?

问题描述 投票:3回答:2

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

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

我支持在环境变量指定选项(I前面加上其内容ARGV),所以它可以设置在该环境变量详细模式,和覆盖它与--no-verbose在命令行上。不过,我不能找到一种方法,用很短的选项来覆盖它。我试着这些没有成功:

-v-
-v0
-v=0

我发现的源代码在https://github.com/ruby/ruby/blob/trunk/lib/optparse.rb但无法弄清楚从答案。

我怎样才能做到这一点?

ruby boolean flags optparse optionparser
2个回答
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默认。如果没有括号,参数解析器不接受-v(不带参数)

0
投票

的布尔标志后直接把n(例如-vn)将其设置为假。本实施例中接通和再关冗长布尔标志,然后打印的数量1:

rexe -mn -v -vn 1

© www.soinside.com 2019 - 2024. All rights reserved.