2013-02-04 69 views
1

我只是想知道如何讓動態(X)數量的參數傳遞給rake任務。 比如我要實現這一點:傳遞給rake任務的X個參數

耙子任務:測試[ARG1,ARG2,ARG3,...]

所以這裏的參數的數目是不固定的,它可能是arg1..arg10arg1..arg20或者更少/更多。

有什麼想法嗎?

P.S:我不想爲這項任務浪費太多內存,因此我正在尋找最佳解決方案。 謝謝。

回答

1

您可以預先定義的參數的最大數量,但你並不需要使用所有:

require 'rake' 
myargs = 'p1'.upto('p20').map{ |x| x.to_sym } 

task :test, myargs do |t, args| 
    puts "#{t}: #{args.inspect}" 
end 

Rake.application[:test].invoke(1,2,3,4,5,6,7,8) 

結果:

test: {:p1=>1, :p2=>2, :p3=>3, :p4=>4, :p5=>5, :p6=>6, :p7=>7, :p8=>8} 

如果您需要默認值,可以它們定義:

task :test, myargs do |t, args| 
    args.with_defaults(:p19 => 'default1') 
    puts "#{t}: #{args.inspect}" 
end 

結果:

test: {:p19=>"default1", :p1=>1, :p2=>2, :p3=>3, :p4=>4, :p5=>5, :p6=>6, :p7=>7, :p8=>8} 

另一種方式來定義參數witth默認值:

myargs = Hash.new{|hash,key| hash[key] = "Default #{key}"} 
20.times{|i| myargs[:"p#{i}"] } 

task :test, myargs.keys do |t, args| 
    args.with_defaults(myargs) 
    puts "#{t}: #{args.inspect}" 
end 
+0

感謝您的回覆,所以問題是我不想限制參數的數量;可能有超過20例如; 1 - 100XX參數,所以如果我有:'myargs ='p1'.upto('p10000')。map {| x | x.to_sym}'那麼這將保留大量的內存.. – tokhi

+0

是的,但老實說:當你通過'rake mytask [1,2,... 100000]'調用任務時,你將如何使用10000參數? – knut

+0

是的,但肯定我可能有超過20個參數,並且這個任務將被隨機調用。無論如何,我把你的答案投給了你。目前它是唯一正確的解決方案:) – tokhi

0

我不知道,如果你還需要這一點,但這裏是我的解決方案:

task :test, [:arg] do |t,args| 
    arguments = Array.new 
    arguments << args.arg 
    args.extras.each{|a| arguments << a} 
    puts arguments 
end 

結果:

rake test[arg1,arg2,arg3,arg4,...] 
arg1 
arg2 
arg3 
arg4 
... 
相關問題