2017-03-01 8 views
0

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. ... 
} 

を、私は、ユーザーがコマンドラインに「-f」または「--file」とタイプすることが起こったかどうかを知りたいのです。これは2つの別々のブロックを書くことなく可能ですか?opts.onブロック?

+3

は待って​​、なぜ? – ndn

+0

@ndnユーザーの行動分析ですか? :) – mudasobwa

+0

@mudasobwa、CLIで? xd – ndn

答えて

0

OptionParser.newブロック内にフラグを渡すことはできません。その時点でそれは遅すぎます。しかし、OptionParserがコマンドラインを解析する前に、渡されているものを見て参照することが可能です。

ARGVには生のコマンドラインが含まれています。

ARGV.grep(/^-/) # => ["-i", "-j"] 
:それは旗をつかむために非常に簡単になり、

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

と:

foo -i 1 -j 2 

が、その後ARGVが含まれています:例えば、これはコマンドラインのいくつかのコードの呼び出しがある場合

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 
+0

はい、私はこれに似た何かをしています。私は正確なオプションフラグを取得することは不可能であることがわかります。私は、独自の、特別なフラグの値を取得するための固有の理由があるので、私はこの特定のアプリケーションのOptionParserを放棄し、私は単にコマンドライン引数を "手で"解析する(つまり、この場合は自分自身をARGVをトラバースすることによって)。 – HippoMan

関連する問題