2015-12-23 12 views
0

我正在學習如何在Ruby中使用符號,並意識到它們主要作爲變量的引用,散列表中的鍵,甚至是作爲在方法中發送塊的方式。使用符號引用Ruby中的塊例如:+,: - ,:*

我的問題是,什麼是符號,如:+:-:*,當我在方法中使用它們時引用?

例如使用:+總結中的所有值的數組:

puts [1,2,3].reduce(:+) 
=> 6 

給出了相同的結果:

puts [1,2,3].reduce {|sum, i| sum += i} 
=> 6 

,如果我創造我自己的版本:+

a = lambda {|sum,i| sum += i} 
puts [1,2,3].reduce(&a) 
=> 6 

我的第一個因此認爲:+引用{|sum, i| sum += i}作爲一個明確的塊,但我很難找到信息來確認。

+0

一些信息在這裏:http://stackoverflow.com/questions/4014190/passing-an-operator-to-a-function –

+0

謝謝你的鏈接! –

回答

4

您傳遞給reduce的符號將被解釋爲要在每個元素上調用的方法的名稱。因此,這

collection.reduce(:foo) 

相當於該

collection.reduce { |memo, element| memo.foo(element) } 

它的工作原理與資金是+運營商實際上只是數字上的方法的原因。

1.+(3) # => 4 

我首先想到的,因此是:+引用{|總之,我| sum + = i}作爲一個明確的塊

不確定你在這裏的含義,但:+肯定不會引用這個塊。或任何塊。或任何事情。

符號只是名稱。他們沒有指向任何東西。決定他們的意思取決於使用它們的代碼。

+0

啊哈!所以在我的例子中,.reduce使用:+符號並將它與其中一個方法關聯起來?感謝您的答覆! –

+0

是的,'+'方法將在集合的每個元素被調用時被調用。在這種情況下,元素是實際擁有這種方法的數字。例如,這對書籍來說不太合適。 –

4

符號不是對變量,哈希表中的鍵的引用,或者是您聲明的發送塊的方式。事實是,一個符號被用來描述這些東西,這是由編寫使用它們的相應方法的人設計的,並且符號在這些東西中的實際映射是在相應的方法中完成的。

對於您的特定示例,:+未參考{|sum, i| sum += i}或任何其他塊;它是reduce的替代語法的一個特性,允許傳遞符號,並將該符號轉換爲塊。相應的塊儘管靠近它,但它不是你想象的,而是:{|sum, i| sum + i}

+1

謝謝!現在它變得更清晰了。 –