Вариант с 2 аргументами в OptParse

Я пытаюсь сделать что-то похожее на это:

opt_parser = OptionParser.new do |opt|
    opt.banner = "Test"
    opt.separator ""
    opt.on("-t", "--test arg1 arg2", "Test") do |arg1, arg2|
        puts arg1
        puts arg2
    end
end

Проблема в том, что он возвращает arg1, а arg2 возвращает nil. Как заставить это работать?


person Nathan Campos    schedule 05.11.2012    source источник


Ответы (2)


Принятый способ указать список значений для данной опции — это повторение этой опции (например, опция -D принята java и компиляторы C), например

my_script.rb --test=arg1 --test=arg2

В некоторых случаях природа ваших аргументов может быть такова, что вы можете позволить себе использовать разделитель, не создавая двусмысленности (например, параметр -classpath для java или, точнее, параметр -o для ps), поэтому, если arg1 и arg2 никогда не могут содержать запятую ,, вы также можете принять, например.

my_script.rb --test=arg1,arg2

Код, поддерживающий оба приведенных выше соглашения, будет выглядеть примерно так:

require 'optparse'
...
test_vals = []
...
opt_parser = OptionParser.new do |opt|
    ...
    opt.on("-t", "--test=arg1[,...]", "Test") do |arg|
        test_vals += arg.split(',')
    end
    ...
end

opt_parser.parse!

puts test_vals.join("\n")

Затем:

$ my_script.rb --test=arg1 --test=arg2
arg1
arg2

$ my_script.rb --test=arg1,arg2
arg1
arg2

$ my_script.rb --test=arg1 --test=arg2,arg3
arg1
arg2
arg3
person vladr    schedule 05.11.2012

Если ответ vladr приемлем, альтернативный способ - передать Array в качестве третьего аргумента #on:

require 'optparse'

test_vals = []

opt_parser = OptionParser.new do |opt|
  opt.banner = "Test"
  opt.separator ""
  opt.on("-t", "--test arg1[,...]", Array, "Test") do |args|
    test_vals += args
  end
end

opt_parser.parse!

puts test_vals.join("\n")
person KITAITI Makoto    schedule 07.12.2013