Ruby er utstyrt med et kraftig og fleksibelt verktøy for å analysere kommandolinjealternativer, OptionParser. Når du har lært hvordan du bruker dette, vil du aldri gå tilbake til å se gjennom ARGV manuelt. OptionParser har en rekke funksjoner som gjør det ganske tiltalende for Ruby-programmerere. Hvis du noen gang har analysert alternativer for hånd i Ruby eller C, eller med getoptlong C-funksjon, vil du se hvor velkommen noen av disse endringene er.
- OptionParser er TØRKE. Du trenger bare å skrive kommandolinjebryteren, dens argumenter, koden som skal kjøres når den oppstår, og kommandolinjebryterbeskrivelsen en gang i skriptet. OptionParser vil automatisk generere hjelpeskjermer for deg fra denne beskrivelsen, samt utlede alt om argumentet fra beskrivelsen. For eksempel vil den kjenne til - fil [FIL] alternativet er valgfritt og tar et enkelt argument. Dessuten vil den vite det - [- ingen] -verbose er egentlig to alternativer og vil akseptere begge skjemaene.
- OptionParser vil automatisk konvertere alternativer til en bestemt klasse. Hvis alternativet tar et helt tall, kan det konvertere alle strenger som sendes på kommandolinjen til et heltall. Dette kutter ned noen av tediumene som er involvert i analysering av kommandolinjealternativer.
- Alt er veldig inneholdt. Alle alternativene er på samme sted, og effekten av alternativet er rett ved siden av definisjonen for alternativet. Hvis alternativer må legges til, endres eller noen bare vil se hva de gjør, er det bare ett sted å lete. Når kommandolinjen er analysert, vil en enkelt Hash eller OpenStruct holde resultatene.
Nok allerede, vis meg noen kode
Så her er et enkelt eksempel på hvordan du bruker OptionParser. Den bruker ikke noen av de avanserte funksjonene, bare det grunnleggende. Det er tre alternativer, og ett av dem tar en parameter. Alle alternativene er obligatoriske. Det er v / - verbose og q / - rask alternativer, så vel som -l / - loggfil alternativ. I tillegg tar skriptet en liste over filer uavhengig av alternativene.
#! / usr / bin / env ruby
# Et skript som later til å endre størrelsen på et antall bilder
krever "optparse"
# Denne hasjen vil inneholde alle alternativene
# analysert fra kommandolinjen av
# OptionParser.
alternativer = {}
optparse = OptionParser.new do | opts |
# Sett et banner, som vises øverst
# av hjelpeskjermen.
opts.banner = "Bruk: optparse1.rb [opsjoner] fil1 fil2 ..."
# Definer alternativene, og hva de gjør
alternativer [: verbose] = usant
opts.on ('-v', '--verbose', 'Output more information') gjør
alternativer [: verbose] = true
slutt
alternativer [: raskt] = usant
opts.on ('-q', '- quick', 'Utfør oppgaven raskt') gjør
alternativer [: raskt] = sant
slutt
alternativer [: logfile] = null
opts.on ('-l', '--logfile FIL', 'Skriv logg til FIL') do | fil |
alternativer [: logfile] = fil
slutt
# Dette viser hjelpeskjermen, alle programmer er det
# antok å ha dette alternativet.
opts.on ('-h', '--help', 'Display this screen') gjør
setter påts
exit
slutt
slutt
# Analyser kommandolinjen. Husk at det er to former
# av analysemetoden. "Analyse" -metoden analyserer ganske enkelt
# ARGV, mens 'parse!' metoden analyserer ARGV og fjerner
# noen alternativer som finnes der, samt parametere for
# alternativene. Det som er igjen er listen over filer som skal endres.
optparse.parse!
setter "Being verbose" hvis alternativer [: verbose]
setter "Å være rask" hvis alternativene [: raskt]
setter "Logging to file # {options [: logfile]}" if options [: logfile]
ARGV.each do | f |
setter "Endre størrelse på bilde # {f} ..."
sove 0,5
slutt
Undersøkelse av koden
Til å begynne med, optparse bibliotek er påkrevd. Husk at dette ikke er et perle. Den leveres med Ruby, så det er ikke nødvendig å installere en perle eller krever det RubyGems før optparse.
Det er to interessante objekter i dette skriptet. Den første er opsjoner, erklært til det høyeste omfanget. Det er en enkel tom hash. Når alternativer er definert, skriver de standardverdiene til denne hasjen. For eksempel er standardoppførselen for at dette skriptet skal ikke være ordrett, så alternativer [: ordrik] er satt til usann. Når det oppstår alternativer på kommandolinjen, endrer de verdiene i opsjoner for å gjenspeile effekten deres. For eksempel når v / - verbose blir møtt, vil den tildele true til alternativer [: ordrik].
Det andre interessante objektet er optparse. Dette er OptionParser objektet selv. Når du konstruerer dette objektet, passerer du det en blokk. Denne blokken kjøres under konstruksjon og vil bygge en liste over alternativer i interne datastrukturer, og gjør deg klar til å analysere alt. Det er i denne blokken at all magien skjer. Du definerer alle alternativene her.
Definere alternativer
Hvert alternativ følger samme mønster. Først skriver du standardverdien inn i hasjen. Dette vil skje så snart OptionParser er konstruert. Deretter kaller du påmetode, som definerer selve alternativet. Det er flere former for denne metoden, men bare en brukes her. De andre skjemaene lar deg definere konverteringer av automatisk type og sett med verdier et alternativ er begrenset til. De tre argumentene som brukes her er den korte formen, den lange formen og beskrivelsen av alternativet.
De på metoden vil utlede en rekke ting fra den lange formen. Én ting er det som vil utlede, er tilstedeværelsen av noen parametere. Hvis det er noen parametere til stede på alternativet, vil det føre dem som parametere til blokken.
Hvis alternativet blir oppstått på kommandolinjen, blir blokken sendt til på metoden kjøres. Her gjør blokkene ikke mye, de setter bare verdier i alternativet hash. Mer kan gjøres, for eksempel å sjekke at en fil referert til eksisterer, etc. Hvis det er noen feil, kan det kastes unntak fra disse blokkene.
Til slutt blir kommandolinjen analysert. Dette skjer ved å ringe til analysere! metode på en OptionParser gjenstand. Det er faktisk to former for denne metoden, parse og analysere!. Som versjonen med utropstegn tilsier, er den ødeleggende. Ikke bare pares den kommandolinjen, men den vil fjerne alle alternativer som finnes fra ARGV. Dette er en viktig ting, den vil bare etterlate listen over filer som leveres etter alternativene i ARGV.