我有一個關於該方法中的明星一個問題:請解釋這個方法
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