在Ruby中是什么:+和&:+?

我已经看过几次了,但是我不知道如何使用它们。 镐说这些是特殊的捷径,但我无法find语法描述。

我在这样的背景下看过他们:

[1,2,3].inject(:+) 

以计算总和为例。

我们从一个简单的例子开始。 假设我们有一串我们想要的大写string:

 ['foo', 'bar', 'blah'].map { |e| e.upcase } # => ['FOO', 'BAR', 'BLAH'] 

另外,您可以创build所谓的Proc对象(闭包):

 block = proc { |e| e.upcase } block.call("foo") # => "FOO" 

您可以将这样的一个proc传递给一个带有&语法的方法:

 block = proc { |e| e.upcase } ['foo', 'bar', 'blah'].map(&block) # => ['FOO', 'BAR', 'BLAH'] 

这是做什么的,就是在块上调用to_proc,然后为每个块调用它:

 some_object = Object.new def some_object.to_proc proc { |e| e.upcase } end ['foo', 'bar', 'blah'].map(&some_object) # => ['FOO', 'BAR', 'BLAH'] 

现在,Rails首先将to_proc方法添加到了Symbol,后来这个方法被添加到了ruby核心库中:

 :whatever.to_proc # => proc { |e| e.whatever } 

所以你可以这样做:

 ['foo', 'bar', 'blah'].map(&:upcase) # => ['FOO', 'BAR', 'BLAH'] 

此外,符号#to_proc更聪明,因为它实际上执行以下操作:

 :whatever.to_proc # => proc { |obj, *args| obj.send(:whatever, *args) } 

这意味着

 [1, 2, 3].inject(&:+) 

等于

 [1, 2, 3].inject { |a, b| a + b }