我有一个关于该方法中的明星一个问题:请解释这个方法
def multiplies_array(*numbers)
numbers.inject(1, :*)
end
什么是参数列表(*numbers
)星的含义是什么? 冒号后的星号是什么意思(1, :*
)?
我有一个关于该方法中的明星一个问题:请解释这个方法
def multiplies_array(*numbers)
numbers.inject(1, :*)
end
什么是参数列表(*numbers
)星的含义是什么? 冒号后的星号是什么意思(1, :*
)?
第一颗星是摔跤运算符。在这种情况下,它将“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) }
我希望这揭示了所有魔法红宝石:)
...谢谢!:) – 2013-04-09 07:58:15
另一个小问题。 除非%w(及以上).include?(string [index]) 什么是%w? – 2013-04-09 08:20:47
@JohnOggy将它作为一个不同的问题发布。什么是'%w'? – 2013-04-09 08:44:08
一个小光见inject.
文档它“融合中的所有元素通过应用一个二进制操作枚举枚举,该操作由一个方法或操作符的块或符号指定。“
因此,:*
被指定乘法运算中numbers.inject(1, :*)
的:*
指定它作为一个符号,但你可以做numbers.inject(1, '*')
为好。使用符号更具惯用性。
第一个是“splat操作符”,google它。第二个是一个常规符号(阅读'Enumerable#inject'的文档。 – 2013-04-09 07:45:58