浏览 5632 次
锁定老帖子 主题:ruby里的曹操(cc)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-07
在ruby中,曹操的这种轻功被称为callcc. callcc{|caocao| for say in ["曹操","诸葛亮","周瑜"] caocao.call if say=="曹操" puts say #不会输出,因为曹操已经飞出去了 end }#“曹操”飞到这里来了(跳出了callcc的block,紧跟在这个block后面,继续执行下面的ruby代码) puts "到" axgle说明:callcc里的caocao是个"延续"(Continuation)对象.这个对象只有名叫“call"的这样一个方法。 当执行了caocao.call后,caocao就会飞到callcc的块(block)后面,让ruby继续执行其下面的代码。 我上面给出的是一个从块里头”飞“到块外面的例子;下面是Programming Ruby给出的从代码后面”飞“到代码前面的例子: arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ] callcc{|$cc|}#下面的$cc.call如果被执行,就会飞回到这里(callcc的块之后)。 puts(message = arr.shift) $cc.call unless message =~ /Max/ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-01-08
在第二个例子中,当流程跳转后,第二次执行
$cc.call unless message =~ /Max/ 是$cc应该为nil,否则将陷入循环,那么$cc对象在那里被置为空的? 肯定不是$cc.call这个地方,因为call方法没有写作call!,那么究竟是在那里?谁知道这里的机制是怎么样的? |
|
返回顶楼 | |
发表时间:2007-01-09
有意思
|
|
返回顶楼 | |
发表时间:2007-01-09
不错不错,很有意思。
|
|
返回顶楼 | |
发表时间:2007-01-09
callcc恐怕是ruby中最难理解的概念。准确来讲,就是callcc把当前栈存起来,然后在某个条件下在取出来执行……
|
|
返回顶楼 | |
发表时间:2007-01-10
很好的比喻
|
|
返回顶楼 | |