我已经看过好几次了,但我不知道如何使用它们.鹤嘴锄说这些是特殊的捷径,但我找不到语法描述.

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

[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 }

Ruby相关问答推荐

RSpec:为什么 `instance_double` 可以与 StandardError 一起使用,但不能与其他异常类一起使用?

从整数中 Select 重复数字的字符串

如何在 Ruby 中创建可调用属性

在 Ruby 中,如何编写一个可以与 &:symbol 一起使用的简单方法?

有人可以解释 Ruby 在块中使用管道字符吗?

数组到哈希:字数

Ruby 符号到类

如何找到安装 Ruby Gem 的路径(即 Gem.lib_path c.f. Gem.bin_path)

Ruby 中的方法: objects与not?

读取文件时如何避免 UTF-8 BOM

无法在 Windows 上安装 Aptana Studio 3.6

在 Ruby 中获取本月的最后一天

HAML 中 Javascript 中的 Ruby 方法

如何使用 RVM 更新 Ruby 解释器?

项目目录的相对路径

将整个文本文件作为单个字符串读取的合理方法是什么?

Ruby中的urldecode?

Ruby 中的 to_s 与 to_str(以及 to_i/to_a/to_h 与 to_int/to_ary/to_hash)

如何在没有 RVM 的 Ubuntu 上安装 Ruby 2

让 sidekiq 立即执行作业(job)