我有一个看起来像这样的方法:
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]
。
有没有一种很好的方法可以在没有一堆条件的情况下编写它?
答案 0 :(得分: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
实例绝不是数组。无论一个人想要超越范围,都必须摒弃:
▶ 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]
答案 1 :(得分: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]
答案 2 :(得分:0)
def method(*parameters)
case parameters.first
when Range
parameters = parameters[0].to_a
when Array
parameters = parameters[0]
end
parameters
end