什么是 Block?

思考这些代码:

1blocks.rb
  1. 3.times do |i|
  2. puts( i )
  3. end

很明显,这段代码实际上会执行三次。在每次连续的循环中 i 的值可能不是那么的明显。实际上,在这种情况下,i 的值将为 0,1 和 2。这是上面代码的另一种形式。这一次,block 由花括号限定,而不是由 doend

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

根据 Ruby 文档,times 是 Integer 类的一个方法(让我们称 Integer 为 int),它迭代一个块 int 次,并且传入从 0 到 int -1 的值’。所以,这里 block 中的代码运行 3 次;第一次运行时,变量 i 其值为 0;在后序循环中,i 将增加 1 直到达到最终值 2(即 int-1)。

请注意,上面的两个代码示例在功能上是相同的。Block 可以用花括号或 doend 关键字括起来,程序员可以根据个人喜好使用任一语法。

注意:一些 Ruby 程序员喜欢在当块的整个代码只有单行时用花括号来限定,而当块跨越多行时使用 do..end。我个人的意见是要统一,不管代码布局如何,我通常在分隔块时都使用花括号。通常,你选择的限定符对代码的行为没有任何影响 - 但请参阅本章后面有关“优先级规则”(precedence rules)的部分。

如果你熟悉类似 C 的语言(如 C# 或 Java),你应该会使用 Ruby 的花括号,就像在这些语言中一样,只需将独立的“块”(blocks)代码组合在一起 - 例如,条件计算结果为 true 时要执行的代码块。但情况并非如此。在 Ruby 中,块是一种特殊的结构,只能在非常特殊的情况下使用。