看起来眼熟?

既然你现在知道 Block 是什么了,你可能会注意到你之前见过它们很多次。

例如,我们之前使用 do..end 块来迭代范围(ranges):

  1. (1..3).each do |i|
  2. puts(i)
  3. end

我们还使用了 do..end 块来迭代数组(参见第 5 章中的 for_each2.rb):

  1. arr = ['one','two','three','four']
  2. arr.each do |s|
  3. puts(s)
  4. end

我们通过将它传递给 loop 方法来重复执行一个 block(参见第 5 章中的 3loops.rb):

  1. i=0
  2. loop {
  3. puts(arr[i])
  4. i+=1
  5. if (i == arr.length) then
  6. break
  7. end
  8. }

上面的 loop 示例在两方面是很明显的:1)它没有要迭代的项目列表(例如数组或范围值);2)它非常难看。这两个特点并非完全不相关!loop 方法是 Kernel 类的一部分,它可以“直接”(automatically)用于你的程序。由于它没有’结束值’(end value),它将永远执行该 block,除非你明确地使用 break 关键字中断它。通常有更优雅的方式来执行这种迭代 - 通过迭代一系列有限范围的值。