看起来眼熟?
既然你现在知道 Block 是什么了,你可能会注意到你之前见过它们很多次。
例如,我们之前使用 do..end
块来迭代范围(ranges):
(1..3).each do |i|
puts(i)
end
我们还使用了 do..end
块来迭代数组(参见第 5 章中的 for_each2.rb):
arr = ['one','two','three','four']
arr.each do |s|
puts(s)
end
我们通过将它传递给 loop
方法来重复执行一个 block(参见第 5 章中的 3loops.rb):
i=0
loop {
puts(arr[i])
i+=1
if (i == arr.length) then
break
end
}
上面的 loop
示例在两方面是很明显的:1)它没有要迭代的项目列表(例如数组或范围值);2)它非常难看。这两个特点并非完全不相关!loop
方法是 Kernel 类的一部分,它可以“直接”(automatically)用于你的程序。由于它没有’结束值’(end value),它将永远执行该 block,除非你明确地使用 break
关键字中断它。通常有更优雅的方式来执行这种迭代 - 通过迭代一系列有限范围的值。