Помогите мне найти варианты для моего маленького сценария - PullRequest
1 голос
/ 23 апреля 2011

Я пытаюсь заставить мой скрипт делать разные вещи, основываясь на опциях.Но ... я вообще не знаю рубина.Я даже не могу сказать вам, что такое массив.Вот что я получил:

require 'optparse'
require 'pp'

# the options eventually get put here
options = {}

optparse = OptionParser.new do|opts|

# the help info
opts.banner = "Usage: script.rb [options] input-file output-file"

# This sets the default of 'flag' to 'false' and says it should be
# 'true' if the '-f' option is present
options[:flag] = false
  opts.on( '-f', '--flag', "Flag has been set" ) do
  options[:flag] = true
  end
end

optparse.parse!

# if no input-file or output-file is given, spit out the help
if ARGV.empty?
  puts optparse
  exit(-1)
end

# If the flag is true then tell me so, if not, tell me it isn't.
if options[:flag] = true
  pp "Flag is true"
else
  pp "Flag is false"
end

Заранее спасибо, и извините за попытку кода, не зная, как кодировать.Я кланяюсь тебе, о великие.

1 Ответ

5 голосов
/ 23 апреля 2011

Опции 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
...