2

我正在尝试做一些看起来像这样的事情:

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. 如何使这项工作?

4

2 回答 2

5

为给定选项指定值列表的公认方法是重复该选项(例如,C 编译器-D接受的选项),例如java

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

在某些情况下,您的论点的性质可能是您可以负担得起使用分隔符而不会引入歧义(例如-classpath选项 tojava或更清楚地是-o选项 to 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
于 2012-11-05T01:34:06.280 回答
3

如果 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")
于 2013-12-07T18:23:26.170 回答