2013-04-09 108 views
1

我有一个关于该方法中的明星一个问题:请解释这个方法

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

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

+1

第一个是“splat操作符”,google它。第二个是一个常规符号(阅读'Enumerable#inject'的文档。 – 2013-04-09 07:45:58

回答

2

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

调用它像这样有四个参数...

multiplies_array 1, 2, 3, 4 

...让你与方法四个元素的单个阵列。

这相当于:

def multiplies_array(numbers) # Without splat operator 
end 

multiplies_array [1, 2, 3, 4] 

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

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

换句话说,*方法应用于numbers数组中的每个项目。如果没有符号的快捷该行看起来像:

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

我希望这揭示了所有魔法红宝石:)

+0

...谢谢!:) – 2013-04-09 07:58:15

+0

另一个小问题。 除非%w(及以上).include?(string [index]) 什么是%w? – 2013-04-09 08:20:47

+1

@JohnOggy将它作为一个不同的问题发布。什么是'%w'? – 2013-04-09 08:44:08

1

一个小光见inject.

文档它“融合中的所有元素通过应用一个二进制操作枚举枚举,该操作由一个方法或操作符的块或符号指定。“

因此,:*被指定乘法运算中numbers.inject(1, :*):*指定它作为一个符号,但你可以做numbers.inject(1, '*')为好。使用符号更具惯用性。