2016-03-11 14 views
2

我有一個看起來像這樣的方法:更好的方式方法參數是否爲數組或範圍

def method(*parameters) 
    ...code... 
    return parameters 
end 

輸入應該是:

method(1, 2, 3) 
method([1, 2, 3]) 
method(*[1, 2, 3]) 
method(1..3) 

我想獲得相同的回報值[1, 2, 3]

有沒有好的方法來寫這沒有一堆條件?

+2

'方法(1,2,3)'相當於'方法(* [1,2,3])'。它沒有任何區別。 – sawa

+0

@mudasobwa我想寫一些過濾方法,可以從參數(日期列表或範圍)中進行選擇。我希望它接受數組或範圍參數 –

+0

@JaehyunShin請查看我的答案更新。 – mudasobwa

回答

3
▶ def m(*pars); puts "#{pars.class}: #{pars.inspect}" end 
▶ m(1, 2, 3); m([1, 2, 3]); m(*[1, 2, 3]); m(1..3) 
#⇒ Array: [1, 2, 3]  # OK 
#⇒ Array: [[1, 2, 3]] # not OK 
#⇒ Array: [1, 2, 3]  # OK  
#⇒ Array: [1..3]   # not OK 

這就是說,變體1和3(他們是絕對相等的,如在@sawa評論說)的罰款。第二個傳遞數組作爲pars數組的第一個參數,從而在結果中產生多餘的嵌套。後者與意圖無關,Range實例絕不意味着一個數組。不管是想通過範圍,必須splatted:

▶ m(*1..3) 
#⇒ Array: [1, 2, 3]  # OK 

的總結「我想它接受陣列或範圍的參數」

▶ def m(*pars) 
▷ pars = [*pars.first] if pars.size == 1 
▷ puts "#{pars.inspect}" 
▷ end 
▶ m(1, 2, 3); m([1, 2, 3]); m(*[1, 2, 3]); m(1..3); m(*1..3) 
#⇒ [1, 2, 3] 
#⇒ [1, 2, 3] 
#⇒ [1, 2, 3] 
#⇒ [1, 2, 3] 
#⇒ [1, 2, 3] 
0
def method(*parameters) 
    case parameters.first 
    when Range 
    parameters = parameters[0].to_a 
    when Array 
    parameters = parameters[0] 
    end 
    parameters 
end 
+1

'parameters = [* parameters.first] if pars.size == 1' – mudasobwa

3
def method(*parameters) 
    parameters.flat_map{|e| [*e]} 
end 

method(1, 2, 3) # => [1, 2, 3] 
method([1, 2, 3]) # => [1, 2, 3] 
method(1..3)  # => [1, 2, 3] 

def method(*parameters) 
    parameters.inject([]){|a, e| a.push(*e)} 
end 

method(1, 2, 3) # => [1, 2, 3] 
method([1, 2, 3]) # => [1, 2, 3] 
method(1..3)  # => [1, 2, 3] 
相關問題