【问题标题】:How do I pass (2-∞) arguments to a ruby method?如何将 (2-∞) 参数传递给 ruby​​ 方法?
【发布时间】:2017-02-03 01:03:13
【问题描述】:

我正在做一个非常简单的练习:一种可以在两个和无限个浮点数之间相乘的方法。我这样做的第一个想法是使用 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

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

【问题讨论】:

    标签: ruby arguments


    【解决方案1】:

    有很多选择。练习的作者可能打算让你使用的那个是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
    

    【讨论】:

    • 值得指出的是,您还可以将字符串作为第二个参数传递给raise,这可以作为有用的消息。
    • 超级,谢谢。我不知道inject。你能解释一下该方法后面的(&:*) 符号吗?
    • @adc 对于注入/减少的简写与对于每个/映射/等的工作方式略有不同,请参阅 stackoverflow.com/questions/14526290/… 以及
    • 也可以使用a * b * rest.inject(1, &:*),避免拆包打包rest
    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2019-03-25
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多