Ruby 如何从OptionParser中获取指定的选项标志

Ruby 如何从OptionParser中获取指定的选项标志,ruby,flags,optionparser,Ruby,Flags,Optionparser,我想从Ruby的OptionParser中获得命令行上指定的确切选项标志 例如,假设我有以下代码: parser = OptionParser.new { |opts|

我想从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'。如果不在块上写两个独立的
选项,这是可能的吗?

我认为在
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
然后,稍后在代码中,您可以检查
选项
散列,查看是否给出了
-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

我认为在
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
然后,稍后在代码中,您可以检查
选项
散列,查看是否给出了
-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

等等,但为什么???@ndn用户的行为分析?:)@mudasobwa,在CLI上?XD请不要这样格式化块参数。ruby允许它的事实并不意味着你应该嘲笑你的代码读者。除了块格式提醒(我很欣赏),我能假设没有第二个opts.on块就没有办法完成我的要求吗?我想知道这个信息有我自己独特的原因:)。。。但是,如果在当前的OptionParser实现中无法实现,我可以不使用它。等等,但是为什么???@ndn用户行为分析?:)@mudasobwa,在CLI上?XD请不要这样格式化块参数。ruby允许它的事实并不意味着你应该嘲笑你的代码读者。除了块格式提醒(我很欣赏),我能假设没有第二个opts.on块就没有办法完成我的要求吗?我想知道这个信息有我自己独特的原因:)。。。但是,如果在当前的OptionParser实现中无法实现,我可以不使用它。是的,我一直在做类似的事情。我认为不可能获得准确的选项标志。我有自己独特的理由想要得到确切的标志值,因此我放弃了这个特定应用程序的OptionParser,我只是“手动”解析命令行参数(即,在本例中,我自己遍历ARGV)。是的,我一直在做类似的事情。我认为不可能获得准确的选项标志。我有自己独特的理由想要获得确切的标志值,因此我放弃了这个特定应用程序的OptionParser,我只是“手动”解析命令行参数(即,在本例中,通过自己遍历ARGV)。