Ruby jest wyposażony w potężne i elastyczne narzędzie do analizowania opcji wiersza poleceń, OptionParser. Gdy nauczysz się korzystać z tego, nigdy nie wrócisz do ręcznego przeglądania ARGV. OptionParser ma wiele funkcji, które sprawiają, że jest bardzo atrakcyjny dla programistów Ruby. Jeśli kiedykolwiek przeanalizowałeś opcje ręcznie w Ruby, C lub z getoptlong Funkcja C, zobaczysz, jak mile widziane są niektóre z tych zmian.
- OptionParser to SUCHY. Musisz tylko napisać przełącznik wiersza polecenia, jego argumenty, kod, który ma zostać uruchomiony, gdy zostanie napotkany, i opis przełącznika wiersza polecenia tylko raz w skrypcie. OptionParser automatycznie wygeneruje dla ciebie ekrany pomocy z tego opisu, a także wyciągnie wnioski na temat argumentu z jego opisu. Na przykład będzie wiedział --plik [PLIK] opcja jest opcjonalna i przyjmuje pojedynczy argument. Będzie to również wiedzieć - [- nie] -verbose to tak naprawdę dwie opcje i zaakceptuje obie formy.
- OptionParser automatycznie przekonwertuje opcje na określoną klasę. Jeśli opcja przyjmuje liczbę całkowitą, może konwertować dowolny ciąg przekazany w wierszu polecenia na liczbę całkowitą. Ogranicza to część nudy związanej z analizowaniem opcji wiersza poleceń.
- Wszystko jest bardzo ograniczone. Wszystkie opcje znajdują się w tym samym miejscu, a efekt opcji znajduje się tuż obok definicji opcji. Jeśli opcje muszą zostać dodane, zmienione lub ktoś po prostu chce zobaczyć, co robią, jest tylko jedno miejsce do obejrzenia. Po przeanalizowaniu wiersza polecenia pojedynczy skrót lub OpenStruct przechowa wyniki.
Wystarczy już, pokaż mi kod
Oto prosty przykład użycia OptionParser. Nie wykorzystuje żadnych zaawansowanych funkcji, tylko podstawy. Istnieją trzy opcje, a jedna z nich przyjmuje parametr. Wszystkie opcje są obowiązkowe. Istnieją -v / - pełne i -q / - szybko opcje, a także -l / - PLIK pliku dziennika opcja. Ponadto skrypt pobiera listę plików niezależnie od opcji.
#! / usr / bin / env ruby
# Skrypt, który będzie udawał, że zmienia rozmiar wielu zdjęć
wymagają „optparse”
# Ten skrót zawiera wszystkie opcje
# parsowane z wiersza poleceń przez
# OptionParser.
opcje = {}
optparse = OptionParser.new do | opts |
# Ustaw baner wyświetlany na górze
# ekranu pomocy.
opts.banner = "Zastosowanie: optparse1.rb [opcje] plik1 plik2 ..."
# Zdefiniuj opcje i co robią
options [: verbose] = false
opts.on („-v”, „--verbose”, „Output more information”) zrobić
options [: verbose] = true
koniec
opcje [: szybkie] = fałsz
opts.on („-q”, „--quick”, „Wykonaj zadanie szybko”) wykonaj
opcje [: szybkie] = prawda
koniec
options [: logfile] = zero
opts.on ('-l', '--logfile FILE', 'Write log to FILE') do | plik |
options [: logfile] = plik
koniec
# Wyświetla ekran pomocy, wszystkie programy są
# zakłada, że ma tę opcję.
opts.on („-h”, „--help”, „Display this screen”) zrobić
stawia opts
wyjście
koniec
koniec
# Analizuj wiersz poleceń. Pamiętaj, że są dwie formy
# metody analizy. Metoda „parsuj” po prostu parsuje
# ARGV, podczas gdy „parsowanie!” Metoda analizuje ARGV i usuwa
# wszelkie znalezione tam opcje, a także wszelkie parametry dla
# opcje. Pozostała lista plików do zmiany rozmiaru.
optparse.parse!
wstawia „Be verbose”, jeśli opcje [: verbose]
wstawia „Być szybkim”, jeśli opcje [: szybkie]
wstawia „Logowanie do pliku # {options [: logfile]}”, jeśli options [: logfile]
ARGV.each do | f |
wstawia „Zmiana rozmiaru obrazu nr {f} ...”
spać 0,5
koniec
Badanie Kodeksu
Na początek, optparse biblioteka jest wymagana. Pamiętaj, że to nie jest klejnot. Jest dostarczany z Ruby, więc nie trzeba instalować klejnotu ani wymagać rubygemy przed optparse.
W tym skrypcie znajdują się dwa interesujące obiekty. Pierwszy to opcje, zadeklarowany w najwyższym zakresie. To jest po prostu puste haszysz. Po zdefiniowaniu opcji zapisują wartości domyślne w tym haszu. Na przykład domyślne zachowanie jest dla tego skryptu nie bądź gadatliwy, więc opcje [: pełne] ma wartość false. Gdy w wierszu poleceń pojawią się opcje, zmienią one wartości w opcje odzwierciedlać ich efekt. Na przykład kiedy -v / - pełne napotkany, przypisze true do opcje [: pełne].
Drugim interesującym przedmiotem jest optparse. To jest OptionParser sam przedmiot. Kiedy konstruujesz ten obiekt, przekazujesz mu blok. Blok ten jest uruchamiany podczas budowy i zbuduje listę opcji w wewnętrznych strukturach danych i przygotuje się do parsowania wszystkiego. W tym bloku dzieje się cała magia. Tutaj definiujesz wszystkie opcje.
Definiowanie opcji
Każda opcja ma ten sam wzór. Najpierw zapisz wartość domyślną w haszu. Stanie się tak szybko, jak OptionParser Jest skonstruowany. Następnie dzwonisz nametoda, który określa samą opcję. Istnieje kilka form tej metody, ale tutaj stosowana jest tylko jedna. Pozostałe formularze pozwalają definiować automatyczne konwersje typów i zestawy wartości, do których ograniczona jest opcja. Trzy użyte tutaj argumenty to krótka forma, długa forma i opis opcji.
The na metoda wywnioskuje wiele rzeczy z długiej formy. Jedną rzeczą jest to, że można wywnioskować, obecność jakichkolwiek parametrów. Jeśli w opcji są jakieś parametry, przekaże je jako parametry do bloku.
Jeśli opcja zostanie napotkana w wierszu polecenia, blok zostanie przekazany do na metoda jest uruchomiona. Tutaj bloki niewiele robią, po prostu ustawiają wartości w skrócie opcji. Można zrobić więcej, na przykład sprawdzając, czy plik, o którym mowa, istnieje itp. Jeśli wystąpią jakieś błędy, z tych bloków można wyrzucić wyjątki.
Na koniec parsowany jest wiersz poleceń. Dzieje się tak, dzwoniąc na numer analizować! metoda na OptionParser obiekt. Istnieją dwie formy tej metody, analizować i analizować!. Jak sugeruje wersja z wykrzyknikiem, jest destrukcyjna. Nie tylko analizuje wiersz poleceń, ale usuwa wszelkie znalezione opcje ARGV. Jest to ważna rzecz, pozostawi tylko listę plików dostarczonych po opcjach w ARGV.