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
我正在使用 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