2013-04-09 104 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, '*')爲好。使用符號更具慣用性。