`
axgle
  • 浏览: 94259 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ruby里的曹操(cc)

阅读更多
曹操(caocao)被誉为“古代轻功最好的人 ”,是因为“说曹操,曹操到”这句名言。
在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/
分享到:
评论
5 楼 coolhair 2007-01-10  
很好的比喻
4 楼 刑天战士 2007-01-09  
callcc恐怕是ruby中最难理解的概念。准确来讲,就是callcc把当前栈存起来,然后在某个条件下在取出来执行……
3 楼 森海 2007-01-09  
不错不错,很有意思。
2 楼 macoo 2007-01-09  
有意思
1 楼 grantren 2007-01-08  
在第二个例子中,当流程跳转后,第二次执行
$cc.call unless message =~ /Max/
是$cc应该为nil,否则将陷入循环,那么$cc对象在那里被置为空的?

肯定不是$cc.call这个地方,因为call方法没有写作call!,那么究竟是在那里?谁知道这里的机制是怎么样的?

相关推荐

Global site tag (gtag.js) - Google Analytics