OptionParser gebruiken om opdrachten in Ruby te parseren

In het artikel dat de functies van OptionParser besprak, hebben we enkele van de redenen besproken die ervoor zorgen dat OptionParser in Ruby de voorkeur verdient boven het handmatig door ARGV kijken om opdrachten handmatig te ontleden. Nu is het tijd om te leren hoe OptionParser en zijn functies te gebruiken.

De volgende boilerplate-code wordt gebruikt voor alle voorbeelden in deze zelfstudie. Om een ​​van de voorbeelden te proberen, plaatst u eenvoudig de voorbeelden opts.on blokkeren naast de TODO-opmerking. Als u het programma uitvoert, wordt de status van de opties en ARGV afgedrukt, zodat u de effecten van uw schakelaars kunt onderzoeken.

#! / usr / bin / env ruby
vereisen 'optparse'
vereisen 'pp'
# Deze hash bevat alle opties
# ontleed vanaf de opdrachtregel door
# OptionParser.
options =
optparse = OptionParser.new do | opts |
# TODO: plaats hier opdrachtregelopties
# Dit toont het helpscherm, alle programma's zijn
# werd verondersteld deze optie te hebben.
opts.on ('-h', '--help', 'Dit scherm weergeven') doen
zet opts
Uitgang
einde
einde
# Parseer de opdrachtregel. Onthoud dat er twee vormen zijn
# van de ontleedmethode. De methode 'ontleden' ontleedt eenvoudig
# ARGV, terwijl de 'ontleden!' methode ontleedt ARGV en verwijdert
# alle opties die daar zijn gevonden, evenals parameters voor
# de opties. Wat overblijft is de lijst met bestanden waarvan het formaat moet worden gewijzigd.
optparse.parse!
pp "Opties:", opties
pp "ARGV:", ARGV

Eenvoudige schakelaar

Een eenvoudige schakelaar is een argument zonder optionele formulieren of zonder parameters. Het effect is om eenvoudig een vlag in de opties-hash te plaatsen. Er worden geen andere parameters doorgegeven aan de Aan methode.

options [: simple] = false
opts.on ('-s', '--simple', "Simple argument") doen
options [: simple] = true
einde

Schakelaar met verplichte parameter

Schakelaars met een parameter hoeven alleen de parameternaam in de lange vorm van de schakelaar te vermelden. Bijvoorbeeld, "-f", "--file FILE" betekent dat de -f of --file-schakelaar een enkele parameter genaamd FILE gebruikt, en deze parameter is verplicht. Je kunt -f of --file niet gebruiken zonder er ook een parameter aan door te geven.

options [: mand] = ""
opts.on ('-m', '- verplicht FILE', "Verplicht argument") do | f |
opties [: mand] = f
einde

Schakelaar met optionele parameter

Schakelparameters hoeven niet verplicht te zijn, ze kunnen optioneel zijn. Om een ​​schakelaarparameter optioneel te verklaren, plaatst u de naam tussen haakjes in de schakelaarbeschrijving. Bijvoorbeeld, "--logbestand [BESTAND]" betekent dat de parameter BESTAND optioneel is. Indien niet meegeleverd, gaat het programma uit van een normale standaard, zoals een bestand met de naam log.txt.

In het voorbeeld, het idioom a = b || c is gebruikt. Dit is slechts steno voor "a = b, maar als b onwaar of nul is, a = c".

options [: opt] = false
opts.on ('-o', '--optional [OPT]', "Optioneel argument") do | f |
opties [: opt] = f || "niets"
einde

Automatisch converteren naar zwevend

OptionParser kan argument automatisch naar sommige typen converteren. Een van deze typen is Float. Als u uw argumenten automatisch wilt omzetten in een schakelaar naar Float, geeft u Float door aan de Aan methode na uw schakelaar beschrijving strings.

Automatische conversies zijn handig. Ze besparen u niet alleen de stap van het converteren van de tekenreeks naar het gewenste type, maar controleren ook het formaat voor u en geven een uitzondering als deze onjuist is opgemaakt.

opties [: float] = 0.0
opts.on ('-f', '--float NUM', Float, "Convert to float") do | f |
opties [: float] = f
einde

Enkele andere typen die OptionParser kan converteren om automatisch Tijd en Geheel getal op te nemen.

Lijsten van argumenten

Argumenten kunnen worden geïnterpreteerd als lijsten. Dit kan worden gezien als een conversie naar een array, terwijl je converteerde naar Float. Hoewel uw optiereeks de parameter kan definiëren die "a, b, c" wordt genoemd, staat OptionParser blindelings een willekeurig aantal elementen in de lijst toe. Dus als u een specifiek aantal elementen nodig hebt, moet u de arraylengte zelf controleren.

opties [: lijst] = []
opts.on ('-l', '--list a, b, c', Array, "Lijst met parameters") do | l |
opties [: lijst] = l
einde

Set van argumenten

Soms is het zinvol om argumenten te beperken tot een overstap naar enkele keuzes. De volgende schakelaar heeft bijvoorbeeld slechts één verplichte parameter nodig en de parameter moet er een van zijn Ja, Nee of kan zijn. Als de parameter iets anders is, wordt een uitzondering gegenereerd.

Om dit te doen, geeft u een lijst met acceptabele parameters als symbolen door na de schakelaarbeschrijvingstrings.

options [: set] =: ja
opts.on ('-s', '--set OPT', [: ja,: nee,: misschien], "Parameters uit een set") do | s |
opties [: set] = s
einde

Ontkende vormen

Schakelaars kunnen een ontkende vorm hebben. De schakelaar --genegeerde kan er een hebben die het tegenovergestelde effect heeft, genaamd --no-ontkracht. Om dit te beschrijven in de schakelaaromschrijvingsreeks, plaatst u het alternatieve gedeelte tussen haakjes: --[No] genegeerde. Als het eerste formulier wordt aangetroffen, wordt true doorgegeven aan het blok en wordt false geblokkeerd als het tweede formulier wordt aangetroffen.

options [: neg] = false
opts.on ('-n', '- [no-] neged', "Negated formulieren") do | n |
opties [: neg] = n
einde