Как запросить один из двух возможных вариантов в Ruby-скрипте?

#ruby #options

#ruby #optionparser

Вопрос:

Я пытаюсь настроить пару параметров в скрипте Ruby с помощью OptionParser . Я бы хотел, чтобы они оба были необязательными, но требовали, чтобы использовался хотя бы один. Один из вариантов позволяет передавать одно значение из командной строки. Другой вариант укажет скрипту использовать файл, содержащий несколько значений для повторения.

Это все, что я смог придумать:

 options = {}

parser = OptionParser.new do |opts|
  opts.banner = "Usage: sat_server_delete.rb [options]"
  opts.on('-f', '--file file', 'File') do |file|
    options[:file] = file;
  end

  opts.on('-s', '--server server', 'Server') do |server|
    options[:server] = server
  end
end.parse!
  

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

Я просмотрел документ Ruby OptionParser , но мне не ясно, как выполнить то, что я пытаюсь. Возможно ли вообще иметь ситуацию или / или с опциями? Я даже не уверен, имеет ли смысл то, что у меня уже есть. Я в основном просто пытаюсь скопировать логику, не полностью понимая, что она делает.

Комментарии:

1. Я думаю, вы просите OptionParser сделать больше, чем его справедливая доля. Его доля заключается в анализе параметров . То, что вы делаете с результатом ( options хэшем), полностью зависит от вас. После анализа всей командной строки вы можете решить exit , если ни один из вариантов не присутствует. Конечно, вы должны указать это поведение в своем usage .

2. @Patru это звучит правильно для меня. Сделайте это ответом, и я поддержу его.

Ответ №1:

Вы можете проверить options хэш после parse! as в

 if options[:file] amp;amp; options[:server]
  puts "may have only one of -f and -s"
  exit
elsif !options[:file] amp;amp; !options[:server]
  puts "must have at least one of -f and -s"
  exit
end
  

Комментарии:

1. Спасибо. Я не был уверен OptionParser , встроена ли эта функциональность.