深入解讀Ruby Continuations
通過(guò)對(duì)Ruby語(yǔ)言的學(xué)習(xí),我們可以知道,它是一種靈活性較強(qiáng)的腳本語(yǔ)言。但是其中也不乏難以理解的內(nèi)容,比如Ruby Continuations。#t#
Ruby Continuations可以處理非局部的跳轉(zhuǎn),它保存了返回地址和執(zhí)行的環(huán)境,和c中的setjmp和longjump類(lèi)似,但它保存了更多的信息:
axgle舉的曹操的例子很形象,我們拿過(guò)來(lái)看看:
曹操(caocao)被譽(yù)為“古代輕功***的人 ”,是因?yàn)?ldquo;說(shuō)曹操,曹操到”這句名言。在ruby中,曹操的這種輕功被稱(chēng)為callcc.
- callcc{|caocao|
- for say in ["曹操","諸葛亮","周瑜"]
- caocao.call if say=="曹操"
- puts say #不會(huì)輸出,因?yàn)椴懿僖呀?jīng)飛出去了
- end
- }
“曹操”飛到這里來(lái)了(跳出了callcc的block,緊跟在這個(gè)block后面,繼續(xù)執(zhí)行下面的ruby代碼),puts "到" callcc里的caocao是個(gè)"延續(xù)"(Continuation)對(duì)象.這個(gè)對(duì)象只有名叫“call"的這樣一個(gè)方法。當(dāng)執(zhí)行了caocao.call后,caocao就會(huì)飛到callcc的塊(block)后面,讓ruby繼續(xù)執(zhí)行其下面的代碼。
我上面給出的是一個(gè)從塊里頭”飛“到塊外面的例子;下面是Programming Ruby給出的從代碼后面”飛“到代碼前面的例子:
- arr = [ "Freddie", "Herbie",
"Ron", "Max", "Ringo" ]- callcc{|$cc|}#下面的$cc.call
如果被執(zhí)行,就會(huì)飛回到這里(callcc的塊之后)。- puts(message = arr.shift)
- $cc.call unless message =~ /Max/
以上就是對(duì)Ruby Continuations的詳細(xì)介紹。


















