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
は待って、なぜ? – ndn
@ndnユーザーの行動分析ですか? :) – mudasobwa
@mudasobwa、CLIで? xd – ndn