轻量级开发的成功秘诀,第 9 部分: 基于 Continuation 的框架
2009-11-11 00:00:00 来源:WEB开发网continuation 基础
如 第 7 部分 所述,continuation 对象就像是一个表示时光暂停点的对象。只要调用 continuation 对象,就会返回该点。对绝大多数人来说,Ruby continuation 比其他语言中的 continuation 要易于理解,所以下面让我们来看一个 Ruby 编程语言中的 continuation 示例。(Smalltalk 中的 continuation 采用相同的运作方式。)您会看到 3 个清晰的步骤:
捕获 continuation Ruby 所使用的是 callcc,这表示用 continuation 进行调用。用continuation 进行调用使您获得一个代码块和指派给变量的 continuation(或已保存的调用堆栈,其中有实例变量)。可将 continuation 视为尚未执行的整个程序。继续处理 callcc 语句不会使语句的状态更改为超出产生 continuation 对象的范围。在 callcc 之后,您不必做任何特殊处理。调用 continuation 在随后调用 continuation 时,将返回到之前的那个时间点。可将 callcc 视为使用 continuation 对象中的调用堆栈替换当前堆栈的操作。在 Ruby 中,执行会在紧接着捕获 continuation 的原 callcc 之后的代码行处继续进行。
Ruby 中的一个 continuation 示例
以下示例展示了当值为 2 时捕获 continuation 的循环:
清单 1. 值为 2 时捕获 continuation 的循环
def loop
cont=nil
for i in 1..4
puts i
callcc {|continuation| cont=continuation} if i==2
end
return cont
end
Ruby 代码相对来说更容易阅读,即便是对这种编程语言不够熟悉,您也应该能够借助一点小小的帮助与提示来理解代码。def loop 语句定义了一种方法。后两行代码定义了一个变量、启动一个 for 循环并输出当前的 i 值。此段代码的关键之处在于第 5 行。仅在 i 为 2 时才执行用 continuation 进行调用并传入代码块。在代码块内部,我将新 continuation 赋给 cont 变量。每当调用 loop 时,它就会返回一个 continuation。Ruby 将捕获调用堆栈和实例变量(在本例中为 cont 和 i 的值)。我在 Ruby 的解释程序 irb 中载入了一个循环程序,并通过代码调用它:
更多精彩
赞助商链接