我有一個看起來像這樣的方法:更好的方式方法參數是否爲數組或範圍
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]
。
有沒有好的方法來寫這沒有一堆條件?
我有一個看起來像這樣的方法:更好的方式方法參數是否爲數組或範圍
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]
。
有沒有好的方法來寫這沒有一堆條件?
▶ 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]
def method(*parameters)
case parameters.first
when Range
parameters = parameters[0].to_a
when Array
parameters = parameters[0]
end
parameters
end
'parameters = [* parameters.first] if pars.size == 1' – mudasobwa
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]
'方法(1,2,3)'相當於'方法(* [1,2,3])'。它沒有任何區別。 – sawa
@mudasobwa我想寫一些過濾方法,可以從參數(日期列表或範圍)中進行選擇。我希望它接受數組或範圍參數 –
@JaehyunShin請查看我的答案更新。 – mudasobwa