1

我想从 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如果不编写两个单独的块,这可能吗?

4

1 回答 1

0

我不认为你可以在OptionParser.new块内获得传递的标志。到那时,为时已晚。但是,在 OptionParser 解析命令行之前,可以查看传入的内容。

ARGV包含原始命令行。例如,如果这是某些代码的命令行调用:

foo -i 1 -j 2

然后ARGV将包含:

["-i", "1", "-j", "2"]

然后,抓住标志变得非常容易:

ARGV.grep(/^-/) # => ["-i", "-j"]

还有其他类似 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. ...
}

我不会那样做,而是这样写:

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
于 2017-03-01T20:41:56.023 回答