Как Вы указываете необходимый переключатель (не аргумент) с Ruby OptionParser?

Используйте программу командной строки xsd.exe, которая идет с Visual Studio для создания файлов класса, которые можно использовать в проекте/решении и Системе. Xml. Пространство имен сериализации (а именно, класс XmlSerializer) к serialize/deserialze те классы к и от диска.

47
задан codeforester 18 March 2017 в 22:08
поделиться

3 ответа

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

Самый простой способ - это, вероятно, проанализировать параметры с помощью выбранной вами библиотеки синтаксического анализа параметров, а затем вызвать исключение OptionParser :: MissingArgument, если значение host равно нулю.

Следующий код иллюстрирует

#!/usr/bin/env ruby
require 'optparse'

options = {}

optparse = OptionParser.new do |opts|
  opts.on('-h', '--host HOSTNAME', "Mandatory Host Name") do |f|
    options[:host] = f
  end
end

optparse.parse!

#Now raise an exception if we have not found a host option
raise OptionParser::MissingArgument if options[:host].nil?


puts "Host = #{options[:host]}"

Запуск этого примера с в командной строке

./program -h somehost

просто отображается «Host = somehost»

При работе с отсутствующим -h и без имени файла выводится следующий результат

./program:15: missing argument:  (OptionParser::MissingArgument)

А при запуске с командной строкой ./program -h -

/usr/lib/ruby/1.8/optparse.rb:451:in `parse': missing argument: -h (OptionParser::MissingArgument)
  from /usr/lib/ruby/1.8/optparse.rb:1288:in `parse_in_order'
  from /usr/lib/ruby/1.8/optparse.rb:1247:in `catch'
  from /usr/lib/ruby/1.8/optparse.rb:1247:in `parse_in_order'
  from /usr/lib/ruby/1.8/optparse.rb:1241:in `order!'
  from /usr/lib/ruby/1.8/optparse.rb:1332:in `permute!'
  from /usr/lib/ruby/1.8/optparse.rb:1353:in `parse!'
  from ./program:13
59
ответ дан 26 November 2019 в 19:11
поделиться

Подход с использованием OPTPARSE, который обеспечивает дружественный выход на пропущенные коммутаторы:

#!/usr/bin/env ruby
require 'optparse'

options = {}

optparse = OptionParser.new do |opts|
  opts.on('-f', '--from SENDER', 'username of sender') do |sender|
    options[:from] = sender
  end

  opts.on('-t', '--to RECIPIENTS', 'comma separated list of recipients') do |recipients|
    options[:to] = recipients
  end

  options[:number_of_files] = 1
  opts.on('-n', '--num_files NUMBER', Integer, "number of files to send (default #{options[:number_of_files]})") do |number_of_files|
    options[:number_of_files] = number_of_files
  end

  opts.on('-h', '--help', 'Display this screen') do
    puts opts
    exit
  end
end

begin
  optparse.parse!
  mandatory = [:from, :to]                                         # Enforce the presence of
  missing = mandatory.select{ |param| options[param].nil? }        # the -t and -f switches
  unless missing.empty?                                            #
    raise OptionParser::MissingArgument.new(missing.join(', '))    #
  end                                                              #
rescue OptionParser::InvalidOption, OptionParser::MissingArgument      #
  puts $!.to_s                                                           # Friendly output when parsing fails
  puts optparse                                                          #
  exit                                                                   #
end                                                                      #

puts "Performing task with options: #{options.inspect}"

работает без -T или -F коммутаторов, показывает следующий вывод:

Missing options: from, to
Usage: test_script [options]
    -f, --from SENDER                username of sender
    -t, --to RECIPIENTS              comma separated list of recipients
    -n, --num_files NUMBER           number of files to send (default 1)
    -h, --help

Запуск анализа Метод в пункте «Начало / спасение» позволяет использовать дружеские форматирование по другим сбоям, таким как отсутствующие аргументы или неверные значения переключателя, например, попробуйте пройти строку для коммутатора -N .

92
ответ дан 26 November 2019 в 19:11
поделиться

Ответ от unknown (Google) - это хорошо, но содержит небольшую ошибку.

rescue OptionParser::InvalidArgument, OptionParser::MissingArgument

должно быть

OptionParser::InvalidOption, OptionParser::MissingArgument

В противном случае optparse.parse! вызовет стандартный вывод ошибки для OptionParser :: InvalidOption , а не для настраиваемого сообщения.

1
ответ дан 26 November 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: