我对这种方法中的星星有疑问:
def multiplies_array(*numbers)
numbers.inject(1, :*)
end
参数列表(*numbers
)中星号的含义是什么?
结肠后的恒星是什么意思(1, :*
)?
答案 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, '*')
。使用符号更具惯用性。