Opdrachtregelopties parseren op de Ruby Way (OptionParser)

Een alternatief voor GetoptLong

Bureau voor cloudcomputing

John Lamb/Digital Vision/Getty Images





Ruby is uitgerust met een krachtige en flexibele tool om opdrachtregelopties te ontleden, OptionParser. Als je eenmaal hebt geleerd hoe je dit moet gebruiken, hoef je nooit meer handmatig door ARGV te kijken. OptionParser heeft een aantal functies die het heel aantrekkelijk maken voor Ruby-programmeurs. Als je ooit opties met de hand hebt geparseerd in Ruby of C, of ​​met de getoptlong C-functie, zult u zien hoe welkom sommige van deze wijzigingen zijn.

    OptieParser is DROOG .U hoeft de opdrachtregelschakelaar, de bijbehorende argumenten, de code die moet worden uitgevoerd wanneer deze wordt aangetroffen en de opdrachtregelschakelaarbeschrijving maar één keer in uw script te schrijven. OptionParser zal automatisch helpschermen voor u genereren uit deze beschrijving, en ook alles over het argument afleiden uit de beschrijving ervan. Het zal bijvoorbeeld de kennen --bestand [BESTAND] optie is optioneel en heeft één argument nodig. Het zal ook weten dat --[-niet]-uitgebreid is eigenlijk twee opties en accepteert beide vormen. OptionParser converteert opties automatisch naar een specifieke klasse.Als de optie een geheel getal nodig heeft, kan het elke tekenreeks die op de opdrachtregel wordt doorgegeven, converteren naar een geheel getal. Dit vermindert een deel van de verveling die gepaard gaat met het ontleden van opdrachtregelopties. Alles is zeer ingesloten.Alle opties bevinden zich op dezelfde plaats en het effect van de optie is direct naast de definitie van de optie. Als er opties moeten worden toegevoegd, gewijzigd of als iemand gewoon wil zien wat hij doet, is er maar één plek om te kijken. Zodra de opdrachtregel is geparseerd, bevat een enkele hash of OpenStruct de resultaten.

Genoeg al, laat me wat code zien

Dus hier is een eenvoudig voorbeeld van hoe te gebruiken OptieParser . Het gebruikt geen van de geavanceerde functies, alleen de basis. Er zijn drie opties, en een daarvan heeft een parameter. Alle opties zijn verplicht. Er zijn de -v/--uitgebreid en -q/--snel opties, evenals de -l/--logbestand BESTAND keuze. Bovendien neemt het script een lijst met bestanden op, onafhankelijk van de opties.



|_+_||_+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|

De code onderzoeken

Om te beginnen, de optparse bibliotheek is vereist. Denk eraan, dit is geenedelsteen. Het wordt geleverd met Ruby, dus het is niet nodig om een ​​edelsteen te installeren of vereist robijn edelstenen voordat optparse .

Er zijn twee interessante objecten in dit script. De eerste is opties , gedeclareerd bij de hoogste scope. Het is een simpele lege hasj . Wanneer opties zijn gedefinieerd, schrijven ze hun standaardwaarden naar deze hash. Het standaardgedrag is bijvoorbeeld dat dit script: niet wees breedsprakig, dus opties[:uitgebreide] is ingesteld op onwaar. Wanneer opties worden aangetroffen op de opdrachtregel, veranderen ze de waarden in opties om hun effect weer te geven. Bijvoorbeeld, wanneer? -v/--uitgebreid wordt aangetroffen, zal het true toewijzen aan opties[:uitgebreide] .



Het tweede interessante object is optparse . Dit is de OptieParser object zelf. Wanneer je dit object construeert, geef je het een blok door. Dit blok wordt tijdens de constructie uitgevoerd en zal een lijst met opties in interne gegevensstructuren bouwen en zich voorbereiden om alles te ontleden. Het is in dit blok dat alle magie gebeurt. U definieert hier alle opties.

Opties definiëren

Elke optie volgt hetzelfde patroon. U schrijft eerst de standaardwaarde in de hash. Dit gebeurt zodra de OptieParser is gebouwd. Vervolgens bel je de Aan methode , die de optie zelf definieert. Er zijn verschillende vormen van deze methode, maar hier wordt er slechts één gebruikt. Met de andere formulieren kunt u automatische typeconversies en reeksen waarden 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 zal afleiden is de aanwezigheid van parameters. Als er parameters aanwezig zijn op de optie, zal deze deze als parameters doorgeven aan het blok.

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 hash van de opties in. Er zou meer kunnen worden gedaan, zoals controleren of een bestand waarnaar wordt verwezen, bestaat, enz. Als er fouten zijn, kunnen uit deze blokken uitzonderingen worden gegenereerd.



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