Ruby OptionParser Сокращенный код для логического варианта? - PullRequest
0 голосов
/ 07 февраля 2019

Я использую Ruby OptionParser (require 'optparse'), обрабатывающий «подробный» параметр, который может быть либо истинным, либо ложным.Это в коде, подобном следующему:

  parser.on('-v', '--[no-]verbose', 'Verbose mode') do |v|
    self.verbose = v
  end

Я поддерживаю указание опций в переменной среды (я добавляю ее содержимое в ARGV), поэтому в этой переменной среды можно включить подробный режим и переопределитьэто в командной строке с --no-verbose.Тем не менее, я не могу найти способ переопределить его с помощью короткой опции.Я попробовал это безуспешно:

-v-
-v0
-v=0

Я нашел исходный код на https://github.com/ruby/ruby/blob/trunk/lib/optparse.rb, но не смог найти ответ на этот вопрос.

Как я могу это сделать

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Помещение n непосредственно после логического флага (например, -vn) устанавливает его в false.В этом примере включается и выключается подробный логический флаг, а затем печатается число 1:

rexe -mn -v -vn 1

0 голосов
/ 07 февраля 2019

На основании https://github.com/ruby/ruby/blob/trunk/lib/optparse.rb#L1936-L1949 и с учетом того, как флаг -v работает для большинства команд, должно работать следующее:

  • -v - аналогично тому, что вы пробовали, но с пробелом
  • -v no
  • -v false

Редактировать

После комментария я углубился в проблему и попыталсяэто самВот что я закончил:

# optparser.rb

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.on("-v", "--[no-]verbose [FLAG]", TrueClass, "Run verbosely") do |v|
    options[:verbose] = v.nil? ? true : v
  end
end.parse!

p options

Важные изменения в коде OP:

  • Добавление [FLAG] 'аргумента'.Это включит аргумент для опции, такой как -v no, -v yes, -v false, -v true, -v n, -v y, -v + (я не получил -v - для работы).
  • Добавление явного приведения аргумента TrueClass.Без него аргумент будет интерпретироваться как строка (например, 'false').
  • Включение аргумента в необязательное значение, включив определение аргумента в [ ], а затем гарантируя, что значение true считается значением по умолчанию черезv.nil? ? true : v.Без фигурных скобок анализатор аргументов не принимает -v (без аргумента)
...