Ruby Language
OptionParser
Suche…
Einführung
Mit OptionParser können Befehlszeilenoptionen von ARGV
.
Obligatorische und optionale Befehlszeilenoptionen
Es ist relativ einfach, die Befehlszeile von Hand zu analysieren, wenn Sie nicht nach etwas zu Komplexem suchen:
# Naive error checking
abort('Usage: ' + $0 + ' site id ...') unless ARGV.length >= 2
# First item (site) is mandatory
site = ARGV.shift
ARGV.each do | id |
# Do something interesting with each of the ids
end
Wenn Ihre Optionen jedoch komplizierter werden, müssen Sie wahrscheinlich einen Options-Parser verwenden, z. B. OptionParser :
require 'optparse'
# The actual options will be stored in this hash
options = {}
# Set up the options you are looking for
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{$0} -s NAME id ..."
opts.on("-s", "--site NAME", "Site name") do |s|
options[:site] = s
end
opts.on( '-h', '--help', 'Display this screen' ) do
puts opts
exit
end
end
# The parse! method also removes any options it finds from ARGV.
optparse.parse!
Es gibt auch eine zerstörungsfreie parse
, aber es ist viel weniger nützlich, wenn Sie den Rest des ARGV
.
Die OptionParser-Klasse hat keine Möglichkeit, obligatorische Argumente durchzusetzen (wie --site
in diesem Fall). Sie können jedoch nach dem parse!
selbst prüfen parse!
:
# Slightly more sophisticated error checking
if options[:site].nil? or ARGV.length == 0
abort(optparse.help)
end
Einen allgemeineren obligatorischen Handler für Optionen finden Sie in dieser Antwort . Falls dies nicht klar ist, sind alle Optionen optional, es sei denn, Sie tun alles, um sie zur Pflicht zu machen.
Standardwerte
Mit OptionsParser
ist es sehr einfach, Standardwerte OptionsParser
. Füllen Sie einfach den Hash vor, in dem Sie die Optionen speichern:
options = {
:directory => ENV['HOME']
}
Wenn Sie den Parser definieren, wird der Standardwert überschrieben, wenn ein Benutzer einen Wert angibt:
OptionParser.new do |opts|
opts.on("-d", "--directory HOME", "Directory to use") do |d|
options[:directory] = d
end
end
Lange Beschreibungen
Manchmal kann Ihre Beschreibung sehr lang werden. Zum Beispiel listet irb -h
ein Argument auf, das wie irb -h
lautet:
--context-mode n Set n[0-3] to method to create Binding Object,
when new workspace was created
Es ist nicht sofort klar, wie dies unterstützt werden soll. Die meisten Lösungen müssen angepasst werden, damit die Einrückung der zweiten und der folgenden Zeilen an der ersten ausgerichtet wird. Glücklicherweise unterstützt die on
Methode mehrere Beschreibungszeilen, indem sie als separate Argumente hinzugefügt werden:
opts.on("--context-mode n",
"Set n[0-3] to method to create Binding Object,",
"when new workspace was created") do |n|
optons[:context_mode] = n
end
Sie können beliebig viele Beschreibungszeilen hinzufügen, um die Option vollständig zu erläutern.