Continuation

调用内部函数 callcc{ |cont| ... }时,它会将此前的状态(局部变量的定义、栈框架)保存到cont中然后执行块。cont是Continuation类的实例,使用Continuation#call 方法就可以随时调出保存的状态然后继续运行。

熟悉C语言的setjmp()/longjmp()的人可以把它想成

setjmp() == callcc {|c| }
longjmp() == c.call

这样或许就好理解了(但有一点不同,当栈朝向纵深发展时,callcc也可以跳转到那里)。

callcc()返回块的返回值,但Continuation#call(args)返回args

例:

下例是由Continuation构成的无限循环

def LOOP
  c = nil
  yield callcc {|c| true}
  c.call(false)
end

LOOP {|v| p v}

=> true
   false
   false
   false
     :
     :

callcc是call-with-current-continuation的缩写形式。

超类:

方法:

self[ret[,ret2[,...]]] ((<ruby 1.8 特性>))
call(ret[,ret2[,...]])

self所保存的状态的基础上继续运行。参数将原封不动地变为callcc的返回值。