2012-11-05 24 views
1

我試圖做一些事情,看起來像這樣:選項以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。如何使這項工作?

回答

5

通過指定值的列表對於給定的選項是重複該選項(例如,作爲接受java和C編譯器的-D選項),例如所接受的方式

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

在某些情況下,你的論點的性質可能是這樣的,你能負擔得起使用分離器沒有,或者更明確地引入歧義(例如-classpath選項java,該-o選項ps ),所以如果arg1arg2不能正常包含逗號,那麼你也可以接受例如

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 
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") 
相關問題