请解释一下这种方法

时间:2013-04-09 07:44:21

标签: ruby inject splat

我对这种方法中的星星有疑问:

def multiplies_array(*numbers)
  numbers.inject(1, :*)
end

参数列表(*numbers)中星号的含义是什么? 结肠后的恒星是什么意思(1, :*)?

2 个答案:

答案 0 :(得分:2)

第一颗星是splat运算符。在这种情况下,它将“multiplies_array的所有参数”“收集”到一个数组中。

用四个参数调用它......

multiplies_array 1, 2, 3, 4

...为您提供一个包含方法中四个元素的数组。

这相当于:

def multiplies_array(numbers) # Without splat operator
end 

multiplies_array [1, 2, 3, 4]

第二颗星有点混乱。这里的乘法运算符是指:

:表示符号。所有Enumerable方法都允许将符号作为快捷方式传递。这意味着:“使用此名称调用方法”。

换句话说,*方法应用于数字数组中的每个项目。没有该行的符号快捷方式:

numbers.inject(1) { |result, number| result * number) }

我希望这会对Ruby魔术的所有内容有所了解:)

答案 1 :(得分:1)

请参阅inject.

的文档

它“通过应用二进制操作组合枚举的所有元素,由块或命名方法或运算符的符号指定。”

因此,:*numbers.inject(1, :*)中指定了乘法运算符:*将其指定为符号,但您也可以numbers.inject(1, '*')。使用符号更具惯用性。