如何从 OptionParser 中获取指定的选项标志
How to get the specified option flag from within OptionParser
我想从 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. ...
}
我想知道用户是否碰巧在命令行中键入了“-f”或“--file”。如果不写两个单独的 opts.on
块,这可能吗?
我认为您无法在 OptionParser.new
块内获得传递的标志。那时已经太晚了。但是,在 OptionParser 解析命令行之前,可以查看传入的内容。
ARGV
包含原始命令行。例如,如果这是某些代码的命令行调用:
foo -i 1 -j 2
然后 ARGV
将包含:
["-i", "1", "-j", "2"]
然后,抢旗就变得很容易了:
ARGV.grep(/^-/) # => ["-i", "-j"]
Ruby 还有其他类似 OptionParser 的工具,这些工具可能会让您访问正在使用的标志,但我想不出我会关心的原因。查看您的代码,您似乎不了解如何使用 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
散列以查看是否给出了 -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
我想从 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. ...
}
我想知道用户是否碰巧在命令行中键入了“-f”或“--file”。如果不写两个单独的 opts.on
块,这可能吗?
我认为您无法在 OptionParser.new
块内获得传递的标志。那时已经太晚了。但是,在 OptionParser 解析命令行之前,可以查看传入的内容。
ARGV
包含原始命令行。例如,如果这是某些代码的命令行调用:
foo -i 1 -j 2
然后 ARGV
将包含:
["-i", "1", "-j", "2"]
然后,抢旗就变得很容易了:
ARGV.grep(/^-/) # => ["-i", "-j"]
Ruby 还有其他类似 OptionParser 的工具,这些工具可能会让您访问正在使用的标志,但我想不出我会关心的原因。查看您的代码,您似乎不了解如何使用 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
散列以查看是否给出了 -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