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
@ 사용자의 행동 분석? :) – mudasobwa
@mudasobwa, CLI? xd – ndn