匿名函数

Ruby 的 block 可以被视为一种匿名函数(nameless function)或方法(method),并且其最常用于提供迭代列表项或范围值的一种方式。如果你之前从未遇到过匿名函数,这可能听起来像官方话(gobbledygook)。幸运的是,到本章结束时,事情会变得更加清晰。让我们回顾一下前面给出的简单示例。我说一个 block 就像一个匿名函数。以此块为例:

  1. { |i|
  2. puts( i )
  3. }

如果它作为普通的 Ruby 方法来编写,它看起来可能像这样:

  1. def aMethod( i )
  2. puts( i )
  3. end

要调用该方法三次并将从 0 到 2 的值传递给它,我们可能会这样写:

  1. for i in 0..2
  2. aMethod( i )
  3. end

当你创建一个匿名方法(即 block),在竖线之间声明的变量(例如 |i|)可以像命名方法的参数一样对待。我们将这些变量称为“块参数”(block parameters)。

再看看我之前的示例:

  1. 3.times { |i|
  2. puts( i )
  3. }

整数的 times 方法将从 0 到具体整数值减去 1 的值传递给块。

所以:

  1. 3.times{ |i| }

…非常像:

  1. for i in 0..2
  2. aMethod( i )
  3. end

主要区别在于第二个示例必须调用其它一些命名方法来处理 i 的值,而第一个示例使用匿名方法(花括号之间的代码)来处理 i