检查方法中的参数是数组还是范围的更好方法

时间:2016-03-11 05:42:13

标签: ruby

我有一个看起来像这样的方法:

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]

有没有一种很好的方法可以在没有一堆条件的情况下编写它?

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