Opdrachtregelopties parseren op de Ruby Way (OptionParser)
Een alternatief voor GetoptLong

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.
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 .