代码块(Blocks)
代码块是Ruby非常重要的一部分,你随处都见到它们被广泛使用。如果你没有使用,那么你将发现许多人使用方法关联代码块,甚至仅仅是让代码结构变得清晰而已。
代码块有三种主要的作用:循环(looping),初始化和销毁(setup and teardown),以及回调和延迟执行(callbacks or deferred action)。
下面这个例子演示了如何使用代码块循环输出菲波那切数列。它使用block_given?方法判断是否关联了一个代码块,否则将从当前方法返回一个枚举器。
yield关键字用来在方法中执行一个代码块,它的参数将传递给代码块。当代码块执行完毕,将返回调用方法,并执行下一行代码。方法返回值为在最大数(max)之前的最后一个菲波那切数。
下一个例子将把设置、销毁以及错误处理等操作代码放到方法中,将方法的主要逻辑放到代码块中。通过这种方式,样板代码就不需要在多个地方重复,另外当你需要改变错误处理代码时,只需要做少量的修改。
yield语句的返回结果,即代码块的返回值,将保存到一个局部变量中。这样,可以将代码块的执行结果作为方法的返回值。
下一个例子不会使用yield关键字。这里有另外一种使用代码块的方法:将‘&’作为方法最后一个参数的前缀,将把关联代码块作为一个Proc对象保存到此参数当中。Proc对象拥有一个call实例方法,可以用来执行代码块,传递给call方法的参数将作为代码块的参数。在这个例子中,你可以保存代码块最为一个回调稍后执行,或者在你需要的时候执行延迟的操作。