Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器
ruby中有很多經(jīng)典的驅(qū)動器結(jié)構(gòu),比如枚舉器和生成器等.這次簡單介紹下生成器的概念.生成器是按照功能要求,一次產(chǎn)生一個對象,或稱之為生成一個對象的方法.ruby中的連續(xù)體正好可以用來完成生成器的功能.連續(xù)體說起來晦澀,其實(shí)還是很簡單的,它有3個特點(diǎn):
1. callcc方法會給代碼塊傳一個連續(xù)體對象,你可以保存該對象;
2. 當(dāng)調(diào)用連續(xù)體的call方法時指令流會跳轉(zhuǎn)到callcc方法之后;
3. 如果給連續(xù)體的call方法傳遞對象,則callcc方法會返回該對象,如果不傳遞對象,callcc會返回nil.
我們下面參考一段實(shí)例代碼,我加了注釋.該代碼用來生成Fibonacci數(shù)列和一個遞增數(shù)列.兩個類FibG和IncG都繼承于"抽象類"G,G實(shí)現(xiàn)生成器的"抽象"事件驅(qū)動邏輯,而具體類FibG和IncG用來完成實(shí)際生成邏輯,全在代碼里啦:
#!/usr/bin/ruby
require 'continuation'
#一個生成器"抽象"類
class G
def initialize
do_g
end
#@main_context實(shí)際是next的"出口",讓next返回@main_context.call(v)的值,即生成的數(shù)
def next
callcc do |c|
@main_context = c
@g_context.call
end
end
private
def do_g
callcc do |c|
@g_context = c
return
end
g_loop #虛方法,由實(shí)際具體類實(shí)現(xiàn),但由G來調(diào)用!
end
#@g_context實(shí)際為G的內(nèi)在驅(qū)動器,其會反復(fù)回到g_loop中不斷生成新的數(shù)
def g(v)
callcc do |c|
@g_context = c
@main_context.call(v)
end
end
end
#具體的生成器類,用來生成Fibonacci數(shù)列
class FibG < G
private
#具體類實(shí)現(xiàn)g_loop,實(shí)際要怎么生成必須由具體類說了算
#g_loop不能直接由FibG的實(shí)例對象調(diào)用,而要通過G來驅(qū)動
def g_loop
g(1)
a,b=1,1
loop do
g(b)
a,b=b,a+b
end
end
end
class IncG < G
def initialize(inc_val=10)
super()
@inc_val = inc_val
end
<span style="font-size:18px;"></span><pre name="code" class="ruby">private
def g_loop
x=0
loop do
g(x+@inc_val)
x+=@inc_val
end
end
end
f = FibG.new
100.times {printf "%d " % f.next}
puts
i = IncG.new
100.times {printf "%d " % i.next}
puts
i = IncG.new(11)
100.times {printf "%d " % i.next}
相關(guān)文章
Ruby在cmd下中文顯示亂碼以及不支持OpenSSL的問題解決
這篇文章主要介紹了Ruby在cmd下中文顯示亂碼以及不支持OpenSSL的問題解決,其中OpenSSL的相關(guān)編譯操作在Linux環(huán)境下進(jìn)行,需要的朋友可以參考下2015-11-11Ruby實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者代碼分享
這篇文章主要介紹了Ruby實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05關(guān)于Ruby on Rails視圖編寫的一些建議
這篇文章主要介紹了關(guān)于Ruby on Rails視圖編寫的一些建議,有助于團(tuán)隊協(xié)作時對代碼的調(diào)試工作,需要的朋友可以參考下2015-08-08win7安裝ruby on rails開發(fā)環(huán)境
看到很多文章都說ruby環(huán)境在windows上是非常難搭建,會出現(xiàn)各種各樣的怪問題,所以都推薦到linux和mac上安裝開發(fā)。但是我按照教程搭了下,問題也不算太多??傔^大概花費(fèi)了2個半小時左右就完成了。下面就把安裝的步驟及具體的版本記錄了一下供大家參考。2014-07-07