如何将(2-∞)参数传递给ruby方法?

时间:2017-02-03 01:03:14

标签: ruby arguments

我正在进行一项非常简单的练习:一种可以在两个浮点数和一个不确定数量的浮点数之间相乘的方法。我这样做的第一个想法是使用splat运算符:

def multiply a, b, *rest
  a * b * rest
end

那是不成功的。然后我尝试了这个:

def multiply *numbers
  total = 1
  numbers.each do |x|
   total = total * x 
  end
  total
end

以上几乎成功 - 问题是它会接受一个参数,我希望它至少需要两个。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

有很多选择。练习的作者可能打算使用的是inject

def multiply(*numbers)
  numbers.inject(&:*)
end

这将导致与第二次multiply实现相同的问题,因为它将接受0或1个参数。如果你没有至少两个,你可以通过简单地提出ArgumentError来解决这个问题:

def multiply(*numbers)
  raise ArgumentError unless numbers.length >= 2
  numbers.inject(&:*)
end

您可以采用另一种方式接受两个实际参数并将其余参数展开,只需构建您想要相乘的完整数组:

def multiply(a, b, *rest)
  [a, b, *rest].inject(&:*)
end