OptionParse без аргументов show banner
Я использую OptionParser
с Ruby.
I другие языки, такие как C, Python и т.д., есть аналогичные синтаксические анализаторы параметров командной строки, и они часто предоставляют способ отображения справочного сообщения, когда параметры не заданы или параметры не соответствуют.
options = {}
OptionParser.new do |opts|
opts.banner = "Usage: calc.rb [options]"
opts.on("-l", "--length L", Integer, "Length") { |l| options[:length] = l }
opts.on("-w", "--width W", Integer, "Width") { |w| options[:width] = w }
opts.on_tail("-h", "--help", "Show this message") do
puts opts
exit
end
end.parse!
Вопросы
- Есть ли способ установить, что по умолчанию отображается сообщение
help
, если параметры не были переданы (ruby calc.rb
)?
- Как насчет того, если требуемый параметр не указан или недействителен? Предположим, что
length
- параметр REQUIRED, и пользователь не передает его или передает что-то не так, как -l FOO
?
Ответы
Ответ 1
Вы можете сделать что-то вроде этого:
require 'optparse'
ARGV << '-h' if ARGV.empty?
options = {}
OptionParser.new do |opts|
opts.banner = "Usage: calc.rb [options]"
opts.on("-l", "--length L", Integer, "Length") { |l| options[:length] = l }
opts.on("-w", "--width W", Integer, "Width") { |w| options[:width] = w }
opts.on_tail("-h", "--help", "Show this message") do
puts opts
exit
end
end.parse!
Ответ 2
-
Вы можете либо проверить ARGV перед разбором (как ответ выше):
ARGV << '-h' if ARGV.empty?
Или проверьте хэш-настройки параметров после разбора:
if @options.empty?
puts optparse.help
puts 'At least 1 argument should be supplied!'
end
-
Это то, что я делаю для обеспечения обязательных аргументов с помощью OptionParse (для этого не найдено никакой встроенной функции):
begin
optparse.parse!
mandatory = [:length, :width] # Enforce the presence of
missing = mandatory.select{ |param| @options[param].nil? } # mandatory switches: :length, :width
if not missing.empty? #
puts "Missing options: #{missing.join(', ')}" #
puts optparse.help #
exit 2 #
end #
rescue OptionParser::InvalidOption, OptionParser::MissingArgument => error #
puts error # Friendly output when parsing fails
puts optparse #
exit 2 #
end