Ruby Language
OptionParser
Поиск…
Вступление
OptionParser можно использовать для анализа параметров командной строки из ARGV
.
Обязательные и необязательные параметры командной строки
Сравнительно легко разобрать командную строку вручную, если вы не ищете слишком сложного:
# Naive error checking
abort('Usage: ' + $0 + ' site id ...') unless ARGV.length >= 2
# First item (site) is mandatory
site = ARGV.shift
ARGV.each do | id |
# Do something interesting with each of the ids
end
Но когда ваши параметры начинают усложняться, вам, вероятно, понадобится использовать парсер параметров, например, OptionParser :
require 'optparse'
# The actual options will be stored in this hash
options = {}
# Set up the options you are looking for
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{$0} -s NAME id ..."
opts.on("-s", "--site NAME", "Site name") do |s|
options[:site] = s
end
opts.on( '-h', '--help', 'Display this screen' ) do
puts opts
exit
end
end
# The parse! method also removes any options it finds from ARGV.
optparse.parse!
Существует также неразрушающий parse
, но он намного менее полезен, если вы планируете использовать оставшуюся часть того, что находится в ARGV
.
Класс OptionParser не имеет возможности принудительно --site
обязательные аргументы (например, --site
в этом случае). Однако вы можете выполнить проверку после выполнения parse!
:
# Slightly more sophisticated error checking
if options[:site].nil? or ARGV.length == 0
abort(optparse.help)
end
Для получения более общего обязательного обработчика опций см. Этот ответ . Если это неясно, все опции являются необязательными, если вы не сделаете так, чтобы сделать их обязательными.
Значения по умолчанию
С помощью OptionsParser
очень просто настроить значения по умолчанию. Просто предварительно заполнив хэш, вы сохраняете параметры в:
options = {
:directory => ENV['HOME']
}
Когда вы определяете парсер, он будет перезаписывать значение по умолчанию, если пользователь предоставит значение:
OptionParser.new do |opts|
opts.on("-d", "--directory HOME", "Directory to use") do |d|
options[:directory] = d
end
end
Длинные описания
Иногда ваше описание может длиться довольно долго. Например, irb -h
перечисляет аргумент, который гласит:
--context-mode n Set n[0-3] to method to create Binding Object,
when new workspace was created
Не сразу понятно, как это поддерживать. Большинство решений требуют регулировки, чтобы отступы второй и последующих линий совпадали с первой. К счастью, метод on
поддерживает несколько строк описания, добавляя их в виде отдельных аргументов:
opts.on("--context-mode n",
"Set n[0-3] to method to create Binding Object,",
"when new workspace was created") do |n|
optons[:context_mode] = n
end
Вы можете добавить столько строк описания, сколько хотите, чтобы полностью объяснить эту опцию.