Опции Hash
options
это не массив, это хэш . В хэше хранятся объекты, каждый со своим собственным специальным ключом. В вашем случае ключ :flag
, поэтому, когда вы звоните options[:flag]
, вы получите то, что там хранится.
options = {}
Это просто создает новый хеш, который пуст.
Анализатор параметров
Давайте возьмем это с самого начала: ваш код начинается с
optparse = OptionParser.new do|opts|
...
end
Вы создаете экземпляр OptionParser
. Это класс, который поможет вам, ну, разбирать варианты. Метод new()
фактически может принимать блок, который является специальной командой Ruby. Если вы не знаете, что такое массив, вам может понадобиться прочитать немного больше о блоках Ruby, потому что это довольно специальный языковой элемент.
В любом случае, он создает объект с именем opts
, который будет обрабатывать аргументы, передаваемые вашему сценарию. Вы можете видеть этот объект в |opts|
(внутри каналов), и это переменная блока - вы уже читали о блоках, не так ли?
Сначала это помогает напечатать баннер с помощью метода banner()
. Позже он проверит методом on()
, был ли передан аргумент.
Кроме того, помните, что теперь у вас есть пустой хэш options
из ранее. В этом случае мы хотим найти переданную опцию -f
, поэтому мы вызываем
opts.on( '-f', '--flag', "Flag has been set" ) do
Как упоминалось ранее, метод on()
ищет свой первый параметр ('-f'
) или альтернативу, например '--flag'
. У этого также есть описание. Если опция была передана, строка ниже будет выполнена, потому что мы хотим запомнить, была ли опция передана или нет:
options[:flag] = true
Теперь ваш хэш options
содержит ключ :flag
, и мы знаем, что это правда.
Примечание: optparse.parse!
фактически просто начнет весь анализ. Помните, что мы уже создали этот объект Option Parser, но он пока ничего не делал сам по себе. Следовательно, этот метод называется parse!()
. Восклицательный знак - это то, что людям нравится использовать в Ruby для некоторых методов. Вы будете иногда сталкиваться с этим . В любом случае, если вы не позвоните parse!
, ничего не произойдет. Так устроен синтаксический анализатор параметров Ruby.
Проверка параметров
Теперь в конце скрипта вы предположите, что все ваши опции находятся в хэше options
, так как парсер опций анализировал все раньше. Просто посмотрите, был ли установлен элемент в ключе :flag
в true:
if options[:flag] == true
И вуаля! Важно : Вы забыли удвоить ==
в своем коде! Вы хотите сделать сравнение, и использование =
установит ключ в значение true, несмотря ни на что. Поэтому, пожалуйста, помните, что для условных выражений вам нужно ==
, а не =
!
Примечание : Мы могли бы также просто искать ключ, чтобы быть там. Поскольку хеш был пуст, раньше у него не было никакого ключа вообще. После разбора опции -f
в хэш был включен ключ :flag
. Таким образом, вместо того, чтобы искать значение, которое, очевидно, может быть только true
, мы могли бы просто искать ключ:
if options.key?(:flag)
# => the flag was set
end
Добавление дополнительных опций
Так же, как метод on()
в вашем примере, вы можете добавить еще один. Просто не забудьте взять другой ключ для вашего хэша, например :execute
.
opts.on( '-x', '--execute', "Do something!" ) do
options[:execute] = true
end