OptionParser-opdrachtregelopties op de Ruby Way

Ruby is uitgerust met een krachtig en flexibel hulpmiddel om opdrachtregelopties, OptionParser, te parseren. Als je eenmaal hebt geleerd hoe je dit kunt gebruiken, zul je nooit meer handmatig door ARGV gaan kijken. OptionParser heeft een aantal functies die het behoorlijk aantrekkelijk maken voor Ruby-programmeurs. Als je ooit opties handmatig hebt ontleed in Ruby of C, of ​​met de blijf lang C-functie, u zult zien hoe welkom sommige van deze wijzigingen zijn.

  • OptionParser is DROOG. U hoeft alleen de opdrachtregeloptie, de argumenten, de code die moet worden uitgevoerd wanneer deze wordt aangetroffen, en de opdrachtregeloptiebeschrijving eenmaal in uw script te schrijven. OptionParser genereert automatisch hulpschermen voor u uit deze beschrijving, en leidt alles over het argument af uit de beschrijving. Hij zal bijvoorbeeld de --bestand [BESTAND] optie is optioneel en neemt een enkel argument. Ook zal het dat weten - [- nee] -verbose is echt twee opties en accepteert beide vormen.
  • OptionParser converteert opties automatisch naar een specifieke klasse.
    instagram viewer
    Als de optie een geheel getal gebruikt, kan elke tekenreeks die op de opdrachtregel wordt doorgegeven, een geheel getal omzetten. Dit vermindert een deel van de verveling die betrokken is bij het parseren van opdrachtregelopties.
  • Alles is erg ingesloten. Alle opties bevinden zich op dezelfde plaats en het effect van de optie bevindt zich direct naast de definitie voor de optie. Als opties moeten worden toegevoegd, gewijzigd of iemand gewoon wil zien wat ze doen, is er maar één plek om te kijken. Nadat de opdrachtregel is geparseerd, bevat een enkele Hash of OpenStruct de resultaten.

Laat me al wat code zien

Dus hier is een eenvoudig voorbeeld van hoe te gebruiken OptionParser. Het maakt geen gebruik van de geavanceerde functies, alleen de basis. Er zijn drie opties, waarvan er één een parameter heeft. Alle opties zijn verplicht. Daar zijn de -v / - uitgebreid en -q / - snel opties, evenals de -l / - logbestand BESTAND optie. Bovendien neemt het script een lijst met bestanden op, onafhankelijk van de opties.

 #! / usr / bin / env ruby

 # Een script dat het formaat van een aantal afbeeldingen zal wijzigen

 vereisen 'optparse'


 # Deze hash bevat alle opties

 # ontleed vanaf de opdrachtregel door

 # OptionParser.

 options = {}


 optparse = OptionParser.new do | opts |

 # Stel een banner in, bovenaan weergegeven

 # van het helpscherm.

 opts.banner = "Gebruik: optparse1.rb [opties] file1 file2 ..."


 # Definieer de opties en wat ze doen

 options [: verbose] = false

 opts.on ('-v', '--verbose', 'Output more information') doen

 options [: verbose] = true

 einde


 options [: quick] = false

 opts.on ('-q', '--quick', 'De taak snel uitvoeren') doen

 options [: quick] = true

 einde


 options [: logfile] = nul

 opts.on ('-l', '--logbestand FILE', 'Schrijf log naar bestand') do | file |

 options [: logfile] = bestand

 einde


 # 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!


 zet "Wordt uitgebreid" als opties [: uitgebreid]

 zet "Snel zijn" als opties [: snel]

 zet "Loggen naar bestand # {options [: logbestand]}" als options [: logbestand]


 ARGV.each do | f |

 zet "Resizing image # {f} ..."

 slaap 0,5

 einde

Onderzoek van de code

Om te beginnen met de optparse bibliotheek is verplicht. Onthoud, dit is geen edelsteen. Het wordt geleverd met Ruby, dus het is niet nodig om een ​​edelsteen te installeren of te vereisen rubygems voordat optparse.

Er zijn twee interessante objecten in dit script. De eerste is opties, gedeclareerd in de topscope. Het is een simpele lege hash. Wanneer opties zijn gedefinieerd, schrijven ze hun standaardwaarden naar deze hash. Het standaardgedrag is bijvoorbeeld voor dit script niet wees uitgebreid, dus options [: uitgebreid] is ingesteld op false. Wanneer opties worden aangetroffen op de opdrachtregel, zullen ze de waarden wijzigen in opties om hun effect weer te geven. Bijvoorbeeld wanneer -v / - uitgebreid wordt aangetroffen, wijst het true toe options [: uitgebreid].

Het tweede interessante object is optparse. Dit is de OptionParser object zelf. Wanneer u dit object construeert, geeft u het een blok door. Dit blok wordt tijdens de bouw uitgevoerd en zal een lijst met opties in interne datastructuren samenstellen en zich voorbereiden om alles te ontleden. In dit blok gebeurt alle magie. U definieert hier alle opties.

Opties definiëren

Elke optie volgt hetzelfde patroon. U schrijft eerst de standaardwaarde in de hash. Dit zal gebeuren zodra de OptionParser is gebouwd. Vervolgens noem je de Aanmethode, die de optie zelf definieert. Er zijn verschillende vormen van deze methode, maar hier wordt er maar één gebruikt. Met de andere formulieren kunt u automatische typeconversies en waardenreeksen definiëren waartoe een optie beperkt is. De drie argumenten die hier worden gebruikt, zijn de korte vorm, de lange vorm en de beschrijving van de optie.

De Aan methode zal een aantal dingen afleiden uit de lange vorm. Een ding is wil is de aanwezigheid van parameters. Als de optie parameters bevat, worden deze als parameters aan het blok doorgegeven.

Als de optie wordt aangetroffen op de opdrachtregel, wordt het blok doorgegeven aan de Aan methode wordt uitgevoerd. Hier doen de blokken niet veel, ze stellen alleen waarden in de opties-hash in. Er kan meer worden gedaan, zoals controleren of een genoemd bestand bestaat, enz. Als er fouten zijn, kunnen uitzonderingen worden gemaakt voor deze blokken.

Ten slotte wordt de opdrachtregel ontleed. Dit gebeurt door de ontleden! methode op een OptionParser voorwerp. Er zijn eigenlijk twee vormen van deze methode, ontleden en ontleden!. Zoals de versie met het uitroepteken al aangeeft, is deze destructief. Het parseert niet alleen de opdrachtregel, maar verwijdert ook alle gevonden opties ARGV. Dit is een belangrijk ding, het laat alleen de lijst met bestanden achter na de opties in ARGV.

instagram story viewer