2015-12-23 14 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

谢谢!现在它变得更清晰了。 –