我想从Ruby's OptionParser中获得在命令行上指定的确切选项标志。
例如,假设我有以下代码:
parser = OptionParser.new {
|opts|
opts.on('-f', '--file FILE', 'filename') {
|arg|
$filename = arg
# Here I'd like to know whether '-f' or '--file' was entered
# on the command line.
}
# ... etc. ...
}
我想知道用户是在命令行上键入'-f'还是 - 文件。这是可以在不编写两个单独的opts.on
块的情况下进行的?
我认为当OptionParser.new
块内部时,您无法将标志通过。那时为时已晚。但是,在选择命令行之前,可以查看并查看正在传递的内容。
ARGV
包含原始命令行。例如,如果这是某些代码的命令行调用:
foo -i 1 -j 2
然后ARGV
将包含:
["-i", "1", "-j", "2"]
,然后抓住标志变得很容易:
ARGV.grep(/^-/) # => ["-i", "-j"]
Ruby还有其他类似选项的工具,这些工具可能会让您访问所使用的标志,但我想不出我永远关心的原因。查看您的代码,似乎您不了解如何使用OptionParser:
parser = OptionParser.new {
|opts|
opts.on('-f', '--file FILE', 'filename') {
|arg|
$filename = arg
# Here I'd like to know whether '-f' or '--file' was entered
# on the command line.
}
# ... etc. ...
}
而不是那样做:
options = {}
OptionParser.new do |opts|
opts.on('-f', '--file FILE', 'filename') { |arg| options[:filename] = arg }
end.parse!
if options[:filename]
puts 'exists' if File.exist?(options[:filename])
end
然后,在您的代码后面,您可以在options
Hash中检查-f
还是--file
选项,以及该值是什么。它是-f
或--file
中的一个或另一个无关紧要。
如果这样做,您需要区分两个标志,而不是像对待它们一样对待它们:
options = {}
OptionParser.new do |opts|
opts.on('-f', 'filename') { |arg| options[:f] = arg }
opts.on('--file FILE', 'filename') { |arg| options[:file] = arg }
end.parse!
if options[:file] || options[:f]
puts 'exists' if File.exist?(options[:file] || options[:f])
end