2011-12-09 89 views
0

我有一個方法可以接收大約20個參數,在這個參數中我想將所有這些參數傳遞給另一個方法。我可以將它們全部轉換成第二種方法,而不必重新輸入它們全部?有一個參數列表或我可以傳遞的東西嗎?Ruby通過很多參數

我有什麼:

def my_method(arg1, arg2, ..., arg20) 
    #do some stuff 
    my_second_method(arg1, arg2, ..., arg20) 
    #do other stuff 
end 

我想什麼:

def my_method(arg1, arg2, ..., arg20) 
    #do some stuff 
    my_second_method(args[array]) 
    #do other stuff 
end 
+9

我強烈建議不要有20個參數。 –

+2

其他人聞到了什麼?像一個爛蛋...... – Mike

回答

8

有一個接受許多參數的方法is a code smell。這種方法幾乎可以肯定地試圖用太多不同種類的數據來做太多事情。

也就是說,如果這是不可避免的,請使用Ruby的splat運算符來嘗試這種方法。

def one(*args) 
    # process/validate args 
    two(*args)  # Note that the splat is needed here too. 
    end 

    def two(*args) 
    # do work 
    end 
5

您可以使用Ruby的圖示操作:

def my_method(*args) 
    # do some stuff 
    my_second_method(*args) 
    # do other stuff 
end 

def my_second_method(*args) 
    # use args[0] through args[19] 
end 
+1

我認爲'my_second_method(args)'應該改成'my_second_method(* args)'(如果Ruby有模式匹配,那麼[即'my_second_method(args)']將是可能的:) ) – maprihoda

+0

已修復,對此感到抱歉。 –

0
def as_array(*args) 
    if args.length == 3 
    a, b, c = args 
    puts "a=#{a} b=#{b} c=#{c}" 
    end 
end 


as_array 1, 2, 3 
3

所以,這可能不是最好的主意,不過話說回來,你可以使用哈希來管理參數。

Rails會這個有很多:

render :partial => "new", :locals => {:object => @my_object} 

Ruby的的ActiveSupport有辦法解決這個問題,該extract_options!功能,即在simone carletti 's blog

+1

帶有20個參數的+1(如果真的需要),選項散列是保持可讀性的好方法。 –

+0

或者參數對象... –

+0

...或關鍵字參數,如果您使用的是Ruby 2.0。 –

0

詳細有一個常見的成語,你可以在經常看到Ruby代碼:

def method1(*args) 
    method2(*args) 
end 

def method2(*args) 
end 

method1(a, b, c, d, e, f, g) 

注意如何圖示運營商使用。它基本上首先將參數打包到一個數組中,然後在方法調用時將其解包回單個參數。當你只需要將參數傳遞給另一種方法時,例如在初始化器中,這非常方便。