我使用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但无法弄清楚从答案。
我怎样才能做到这一点?
基于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 -
工作)。TrueClass
。如果没有它,参数将被解释为一个字符串(例如'false'
)。[
]
参数定义,然后确保真正被认为是通过v.nil? ? true : v
默认。如果没有括号,参数解析器不接受-v
(不带参数)的布尔标志后直接把n
(例如-vn
)将其设置为假。本实施例中接通和再关冗长布尔标志,然后打印的数量1:
rexe -mn -v -vn 1