论坛首页 编程语言技术论坛

ruby里的曹操(cc)

浏览 5603 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-07  
曹操(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/
   发表时间:2007-01-08  
在第二个例子中,当流程跳转后,第二次执行
$cc.call unless message =~ /Max/
是$cc应该为nil,否则将陷入循环,那么$cc对象在那里被置为空的?

肯定不是$cc.call这个地方,因为call方法没有写作call!,那么究竟是在那里?谁知道这里的机制是怎么样的?
0 请登录后投票
   发表时间:2007-01-09  
有意思
0 请登录后投票
   发表时间:2007-01-09  
不错不错,很有意思。
0 请登录后投票
   发表时间:2007-01-09  
callcc恐怕是ruby中最难理解的概念。准确来讲,就是callcc把当前栈存起来,然后在某个条件下在取出来执行……
0 请登录后投票
   发表时间:2007-01-10  
很好的比喻
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics