赞 | 5 |
VIP | 620 |
好人卡 | 38 |
积分 | 69 |
经验 | 125468 |
最后登录 | 2015-7-27 |
在线时间 | 1666 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 6865
- 在线时间
- 1666 小时
- 注册时间
- 2008-10-29
- 帖子
- 6710
|
12# 奶油Da蛋糕
就是相当于脚本的跳转这样的功能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的缩写形式。
超类:Object
方法:self[ret[,ret2[,...]]] ((<ruby 1.8 特性>))
call(ret[,ret2[,...]])
在self所保存的状态的基础上继续运行。参数将原封不动地变为callcc的返回值。
--------------------------------------------------------------------------------
原文由 webmaster[at]ruby-lang.org 所著
稀亿网络软件(北京)进行翻译
我们在寻找热爱Ruby的技术人员和日语人才!
最后更新:2006-10-23 |
|