Опции командной строки OptionParser в Ruby Way

Ruby оснащен мощным и гибким инструментом для анализа параметров командной строки OptionParser. Когда вы научитесь использовать это, вы никогда не вернетесь к просмотру ARGV вручную. OptionParser имеет ряд функций, которые делают его весьма привлекательным для программистов на Ruby. Если вы когда-либо анализировали параметры вручную в Ruby или C, или с getoptlong С функцией, вы увидите, насколько приветствуются некоторые из этих изменений.

  • OptionParser is DRY. Вам нужно только написать параметр командной строки, его аргументы, код для запуска, когда он обнаружен, и описание параметра командной строки в вашем сценарии. OptionParser автоматически сгенерирует для вас экраны справки из этого описания, а также выведет все аргументы из его описания. Например, он будет знать --file [ФАЙЛ] опция является необязательной и принимает один аргумент. Кроме того, он будет знать, что нет - [- нет] -verbose действительно два варианта и примут обе формы.
  • OptionParser автоматически преобразует параметры в определенный класс.
    instagram viewer
    Если параметр принимает целое число, он может преобразовать любую строку, переданную в командной строке, в целое число. Это сокращает некоторые утомительные действия при разборе параметров командной строки.
  • Все очень сдержано. Все параметры находятся в одном и том же месте, и эффект параметра находится рядом с определением параметра. Если параметры нужно добавить, изменить или кто-то просто хочет посмотреть, что они делают, есть только одно место для поиска. После того, как командная строка проанализирована, один хэш или OpenStruct будут содержать результаты.

Уже достаточно, покажи мне код

Итак, вот простой пример того, как использовать OptionParser. Он не использует никаких расширенных функций, только основы. Есть три варианта, и один из них принимает параметр. Все варианты являются обязательными. Есть -v / - многословный и -q / - быстрый варианты, а также -l / - файл журнала ФАЙЛ вариант. Кроме того, скрипт принимает список файлов независимо от параметров.

 #! / usr / bin / env ruby

 # Скрипт, который будет притворяться, изменяет размер ряда изображений

 требует "optparse"


 # Этот хеш будет содержать все параметры

 # анализируется из командной строки

 # OptionParser.

 варианты = {}


 optparse = OptionParser.new do | opts |

 # Установить баннер, отображаемый вверху

 # экрана справки.

 opts.banner = "Использование: optparse1.rb [параметры] файл1 файл2 ..."


 Определите параметры и что они делают

 options [: verbose] = false

 opts.on ('-v', '--verbose', 'Вывести дополнительную информацию') do

 options [: verbose] = true

 конец


 параметры [: быстро] = ложь

 opts.on ('-q', '--quick', 'Быстро выполнить задачу') сделать

 параметры [: быстро] = правда

 конец


 options [: logfile] = nil

 opts.on ('-l', '--logfile FILE', 'Записать журнал в FILE') do | file |

 options [: logfile] = файл

 конец


 # Появится экран справки, все программы

 # предполагается, что есть эта опция.

 opts.on ('-h', '--help', 'Показать этот экран') сделать

 ставит опции

 выход

 конец

 конец


 # Разбор командной строки. Помните, что есть две формы

 # метода разбора. Метод parse просто разбирает

 # ARGV, пока "разбирайся!" метод разбирает ARGV и удаляет

 # любые параметры, найденные там, а также любые параметры для

 # варианты. То, что осталось, это список файлов для изменения размера.

 optparse.parse!


 помещает "Быть многословным", если параметры [: многословно]

 ставит «Быстро», если опции [: быстро]

 помещает «Вход в файл # {options [: logfile]}», если options [: logfile]


 ARGV.each do | f |

 ставит "Изменение размера изображения # {f} ..."

 спать 0,5

 конец

Изучение кода

Для начала, optparse библиотека обязательна Помните, это не драгоценный камень. Он поставляется с Ruby, поэтому нет необходимости устанавливать гем или требовать RubyGems перед optparse.

В этом сценарии есть два интересных объекта. Первый параметрызаявлено в самой верхней области. Это простой пустой гашиш. Когда параметры определены, они записывают свои значения по умолчанию в этот хэш. Например, поведение по умолчанию для этого сценария не быть многословным, так опции [: многословным] установлено в false. Когда параметры встречаются в командной строке, они изменяют значения в параметры отражать их влияние. Например, когда -v / - многословный встречается, он назначит true опции [: многословным].

Второй интересный объект optparse. Это OptionParser сам объект Когда вы создаете этот объект, вы передаете ему блок. Этот блок запускается во время построения и создает список параметров во внутренних структурах данных, а также готовится к анализу всего. Именно в этом блоке происходит вся магия. Вы определяете все варианты здесь.

Определение параметров

Каждый вариант следует той же схеме. Сначала вы записываете значение по умолчанию в хеш. Это произойдет, как только OptionParser построен Далее вы называете наметод, который определяет сам вариант. Существует несколько форм этого метода, но здесь используется только одна. Другие формы позволяют вам определять автоматические преобразования типов и наборы значений, которыми ограничен параметр. Здесь используются три аргумента: краткая форма, длинная форма и описание опции.

на Метод выведет ряд вещей из длинной формы. Одно будет выводить наличие каких-либо параметров. Если в опции есть какие-либо параметры, они передадут их как параметры в блок.

Если опция встречается в командной строке, блок передается на метод запущен. Здесь блоки мало что делают, они просто устанавливают значения в хэше параметров. Можно сделать больше, например, проверить, существует ли указанный файл и т. Д. Если есть какие-либо ошибки, исключения могут быть выброшены из этих блоков.

Наконец, командная строка анализируется. Это происходит путем вызова разобрать! метод на OptionParser объект. На самом деле есть две формы этого метода, синтаксический анализ и разобрать!. Как следует из версии с восклицательным знаком, она разрушительна. Он не только анализирует командную строку, но и удаляет все найденные параметры из ARGV. Это важная вещь, она оставит только список файлов, предоставленных после опций в ARGV.

instagram story viewer