Вот ссылка на мой последний средний пост: Program Arguments in Ruby: Part I

В этой статье мы рассмотрим следующие темы:

  • OptionParser класс
  • OptionParser#on метод
  • OptionParser#on и приведение типов

Прежде чем начать

Позвольте мне представить здесь платформу, которая помогла мне изучить большую часть моих знаний о Ruby. Действительно, Pluralsight - потрясающая платформа.

С 50+ курсами, которые охватывают различные темы по Ruby и Ruby on Rails, это лучший способ поднять свои знания на новый уровень!

Попробуйте бесплатно 👇😉



Спасибо за уделенное время!

Класс OptionParser

OptionParser - это класс, упрощающий синтаксический анализ и интерпретацию параметров командной строки.

Этот класс предоставляет набор методов для обработки баннеров, справочных сообщений о параметрах, приведения типов и т. Д.

OptionParser # в методе

Метод OptionParser#on добавляет к анализатору переключатель, связанный с обработчиком.

Переключатель - это экземпляр класса, производного от OptionParser::Switch.

Наиболее важные производные классы:

- OptionParser::Switch::NoArgument
- OptionParser::Switch::RequiredArgument
- OptionParser::Switch::OptionalArgument

Эти классы отвечают за обработку аргументов в соответствии со своей специализацией.

Он также сохраняет блок, переданный как аргумент метода OptionParser#on. Этот блок хранится как proc внутри соответствующего переключателя.

Придется усвоить большой словарный запас, и это может быть трудно разгадать.

Итак, давайте разберем эту концепцию на серии примеров для каждого переключателя.

OptionParser :: Switch :: NoArgument

Основное использование метода OptionParser#on - обработка параметра, не имеющего аргументов.

# in parser.rb
require 'optparse'
require 'optparse/time'
OptionParser.new do |parser|
 parser.on('-t', '--time') do |time|
   p time
 end
end.parse!

В приведенном выше примере программа сможет связать короткий параметр -t и длинный параметр --time с блоком, переданным в качестве аргумента метода parser.on().

В этом случае вариант не требует аргументов.

Итак, сгенерированный переключатель будет экземпляром OptionParser::Switch::NoArgument.

Это означает, что любой аргумент, переданный в параметр -t, будет проигнорирован.

?> ruby parser.rb --time=11:12:13
true

Здесь аргумент 11:12:13 опции--time игнорируется и вместо него возвращается true.

Теперь давайте посмотрим, как требовать аргумент для данной опции.

OptionParser :: Switch :: RequiredArgument

Давайте посмотрим, как синтаксис требует аргумента

# in parser.rb
require 'optparse'
require 'optparse/time'
OptionParser.new do |parser|
 parser.on('-t', '--time=TIME') do |time|
   p time
 end
end.parse!

В этом случае для опции -t требуется аргумент, обозначенный словом TIME.

Таким образом, сгенерированный переключатель для параметра -t будет экземпляром OptionParser::Switch::RequiredArgument.

?> ruby parser.rb --time=11:12:13
"11:12:13"
?> ruby parser.rb --time
parser.rb:8:in `<main>’: missing argument: --time (OptionParser::MissingArgument)

Здесь аргумент 11:12:13 параметра --time передается как аргумент блока, который передается методу parser.on().

Обратите внимание, что аргумент time - это String.

Кроме того, возникает ошибка OptionParser::MissingArgument, если аргумент не указан для параметра --time.

Теперь давайте посмотрим, как добавить необязательный аргумент к опции.

OptionParser :: Switch :: OptionalArgument

Вот синтаксис для добавления необязательного аргумента

# in parser.rb
require 'optparse'
require 'optparse/time'
OptionParser.new do |parser|
 parser.on('-t', '--time[=TIME]') do |time|
   p time
 end
end.parse!

Необязательный аргумент обозначается словом =TIME в квадратных скобках ([=TIME]).

В этом случае сгенерированный переключатель для параметра -t будет экземпляром OptionParser::Switch::OptionalArgument

?> ruby parser.rb --time=11:12:13
"11:12:13"
?> ruby parser.rb --time
nil

Здесь аргумент 11:12:13 опции--time передается как аргумент блока parser.on().

Кроме того, аргумент time равен nil, если для параметра--time не задан аргумент.

В нашем примере time - это String. Было бы здорово получить этот аргумент блока как объект Time.

OptionParser # on и приведение типов

Для этого мы можем добавить третий аргумент к методу OptionParser#on. Этот аргумент исключает класс Ruby, чтобы преобразовать аргумент параметра в экземпляр данного типа класса.

require 'optparse'
require 'optparse/time'
OptionParser.new do |parser|
 parser.on('-t', '--time=TIME', Time) do |time|
   p time.class
 end
end.parse!

Запустим программу

?> ruby parser.rb --time=11:12:13
Time

Здесь мы видим, что аргумент time теперь является экземпляром Time, как указано в качестве третьего аргумента вызова метода parser.on().

Вуаля!

Спасибо, что нашли время прочитать этот пост :-)

Не стесняйтесь 👏 и поделитесь этим постом на Medium, если он был вам полезен.

Вот ссылка на мой последний средний пост:

Command-line Arguments in Ruby: Part I