Ruby er udstyret med et kraftfuldt og fleksibelt værktøj til at analysere kommandolinjemuligheder, OptionParser. Når du lærer, hvordan du bruger dette, vil du aldrig vende tilbage til at gennemse ARGV manuelt. OptionParser har en række funktioner, der gør det ret tiltalende for Ruby-programmører. Hvis du nogensinde har analyseret indstillinger manuelt i Ruby eller C, eller med getoptlong C-funktion, vil du se, hvor velkommen nogle af disse ændringer er.
- OptionParser er TØR. Du behøver kun at skrive kommandolinjekontakten, dens argumenter, koden, der skal køres, når den er fundet, og kommandolinjekontaktbeskrivelsen én gang i dit script. OptionParser genererer automatisk hjælpeskærmbilleder til dig fra denne beskrivelse, såvel som at udlede alt om argumentet fra dens beskrivelse. For eksempel kender den - fil [FIL] indstillingen er valgfri og tager et enkelt argument. Det vil det også vide - [- no] -verbose er virkelig to muligheder og accepterer begge former.
- OptionParser konverterer automatisk indstillinger til en bestemt klasse. Hvis indstillingen tager et heltal, kan det konvertere en hvilken som helst streng, der er sendt på kommandolinjen, til et heltal. Dette skærer ned på nogle af det tedium, der er involveret i analyse af kommandolinjemuligheder.
- Alt er meget indeholdt. Alle indstillingerne er på samme sted, og effekten af indstillingen er lige ved siden af definitionen for indstillingen. Hvis indstillinger skal tilføjes, ændres, eller hvis nogen blot vil se, hvad de gør, er der kun et sted at kigge efter. Når kommandolinjen er parset, vil en enkelt Hash eller OpenStruct indeholde resultaterne.
Nok allerede, vis mig noget kode
Så her er et simpelt eksempel på, hvordan man bruger OptionParser. Det bruger ikke nogen af de avancerede funktioner, bare det grundlæggende. Der er tre muligheder, og en af dem tager en parameter. Alle indstillinger er obligatoriske. Der er -v / - verbose og -q / - hurtig indstillinger såvel som -l / - logfil FIL mulighed. Derudover tager scriptet en liste over filer uafhængigt af indstillingerne.
#! / usr / bin / env ruby
# Et script, der vil foregive at ændre størrelsen på et antal billeder
kræver 'optparse'
# Denne hash indeholder alle mulighederne
# parset fra kommandolinjen af
# OptionParser.
indstillinger = {}
optparse = OptionParser.new do | opts |
# Sæt et banner, der vises øverst
# af hjælpeskærmen.
opts.banner = "Brug: optparse1.rb [indstillinger] fil1 fil2 ..."
# Definer indstillingerne, og hvad de gør
indstillinger [: verbose] = falsk
opts.on ('-v', '--verbose', 'Output more information') gør
indstillinger [: verbose] = sandt
ende
indstillinger [: hurtig] = falsk
opts.on ('-q', '--quick', 'Udfør opgaven hurtigt') gør
indstillinger [: hurtig] = sandt
ende
optioner [: logfile] = nul
opts.on ('-l', '--logfil FIL', 'Skriv log til FIL') do | fil |
optioner [: logfile] = fil
ende
# Dette viser hjælpeskærmen, alle programmer er
# antages at have denne mulighed.
opts.on ('-h', '--help', 'Display this screen') gør
sætter valg
Afslut
ende
ende
# Analyser kommandolinjen. Husk, at der er to former
# af analysemetoden. Metoden "analyser" analyserer simpelthen
# ARGV, mens 'parse!' metode analyserer ARGV og fjerner
# eventuelle fundne muligheder der samt parametre til
# indstillingerne. Hvad der er tilbage er listen over filer, der skal ændres.
optparse.parse!
sætter "At være verbose", hvis indstillinger [: verbose]
sætter "At være hurtig", hvis indstillingerne [: hurtig]
sætter "Logging til fil # {optioner [: logfile]}" hvis indstillinger [: logfile]
ARGV.each do | f |
sætter "Ændring af størrelse nr. {f} ..."
sove 0,5
ende
Undersøgelse af koden
Til at starte med, optparse bibliotek er påkrævet. Husk, at dette ikke er et perle. Den leveres med Ruby, så der er ingen grund til at installere en perle eller kræve rubygems Før optparse.
Der er to interessante objekter i dette script. Den første er muligheder, erklæret som det øverste omfang. Det er en simpel tom hash. Når indstillinger er defineret, skriver de deres standardværdier til denne hash. For eksempel er standardopførselen til, at dette script skal ikke være ordret, så optioner [: verbose] er indstillet til falsk. Når der findes muligheder på kommandolinjen, ændrer de værdierne i muligheder at afspejle deres virkning. For eksempel, hvornår -v / - verbose er fundet, tildeles den sand til optioner [: verbose].
Det andet interessante objekt er optparse. Dette er OptionParser objekt selv. Når du konstruerer dette objekt, passerer du det en blok. Denne blok køres under konstruktionen og vil opbygge en liste over indstillinger i interne datastrukturer og gøre sig klar til at analysere alt. Det er i denne blok, at al magien sker. Du definerer alle indstillingerne her.
Definition af indstillinger
Hver indstilling følger det samme mønster. Først skriver du standardværdien til hash. Dette vil ske, så snart OptionParser er konstrueret. Derefter ringer du til påmetode, som definerer selve indstillingen. Der er flere former for denne metode, men kun en bruges her. De andre formularer giver dig mulighed for at definere konvertering af automatisk type og sæt af værdier, som en indstilling er begrænset til. De tre argumenter, der er brugt her, er den korte form, den lange form og beskrivelsen af indstillingen.
Det på metode vil udlede en række ting fra den lange form. Én ting er at udlede er tilstedeværelsen af eventuelle parametre. Hvis der er nogen parametre til stede på indstillingen, vil de sende dem som parametre til blokken.
Hvis indstillingen findes på kommandolinjen, overføres blokken til på metoden køres. Her gør blokke ikke meget, de indstiller bare værdier i indstillinger hash. Mere kunne gøres, f.eks. At kontrollere, at der findes en fil, der henvises til, osv. Hvis der er nogen fejl, kan der kastes undtagelser fra disse blokke.
Endelig parses kommandolinjen. Dette sker ved at ringe til parse! metode på en OptionParser objekt. Der er faktisk to former for denne metode, parse og parse!. Som versionen med udråbstegn antyder, er den destruktiv. Den analyserer ikke kun kommandolinjen, men den fjerner alle muligheder, der findes fra argv. Dette er en vigtig ting, det vil kun efterlade listen over filer, der leveres efter indstillingerne i argv.