我已经看过好几次了,但我不知道如何使用它们.鹤嘴锄说这些是特殊的捷径,但我找不到语法描述.
我在这样的背景下见过他们:
[1,2,3].inject(:+)
例如计算总和.
我已经看过好几次了,但我不知道如何使用它们.鹤嘴锄说这些是特殊的捷径,但我找不到语法描述.
我在这样的背景下见过他们:
[1,2,3].inject(:+)
例如计算总和.
让我们从一个简单的例子开始.
['foo', 'bar', 'blah'].map { |e| e.upcase }
# => ['FOO', 'BAR', 'BLAH']
此外,还可以创建所谓的Proc对象(闭包):
block = proc { |e| e.upcase }
block.call("foo") # => "FOO"
您可以使用&;将这样的过程传递给方法;语法:
block = proc { |e| e.upcase }
['foo', 'bar', 'blah'].map(&block)
# => ['FOO', 'BAR', 'BLAH']
它的作用是在块上调用_proc,然后 for each 块调用它:
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']
此外,Symbol#to _proc甚至更智能,因为它实际上执行以下操作:
:whatever.to_proc # => proc { |obj, *args| obj.send(:whatever, *args) }
这意味着
[1, 2, 3].inject(&:+)
等于
[1, 2, 3].inject { |a, b| a + b }