主頁(yè) > 知識(shí)庫(kù) > Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器

Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器

熱門(mén)標(biāo)簽:天津外呼系統(tǒng)怎么收費(fèi) 征服者企業(yè)地圖標(biāo)注 中牟外呼系統(tǒng)違法嗎 外呼線路從哪里出來(lái)的 柯城手機(jī)地圖如何做地圖標(biāo)注 巫師3地圖標(biāo)注魔力之所 淮安自動(dòng)外呼系統(tǒng)供應(yīng)商 AI電銷機(jī)器人 線路 漯河電銷

ruby中有很多經(jīng)典的驅(qū)動(dòng)器結(jié)構(gòu),比如枚舉器和生成器等.這次簡(jiǎn)單介紹下生成器的概念.生成器是按照功能要求,一次產(chǎn)生一個(gè)對(duì)象,或稱之為生成一個(gè)對(duì)象的方法.ruby中的連續(xù)體正好可以用來(lái)完成生成器的功能.連續(xù)體說(shuō)起來(lái)晦澀,其實(shí)還是很簡(jiǎn)單的,它有3個(gè)特點(diǎn):

1. callcc方法會(huì)給代碼塊傳一個(gè)連續(xù)體對(duì)象,你可以保存該對(duì)象;
2. 當(dāng)調(diào)用連續(xù)體的call方法時(shí)指令流會(huì)跳轉(zhuǎn)到callcc方法之后;
3. 如果給連續(xù)體的call方法傳遞對(duì)象,則callcc方法會(huì)返回該對(duì)象,如果不傳遞對(duì)象,callcc會(huì)返回nil.

我們下面參考一段實(shí)例代碼,我加了注釋.該代碼用來(lái)生成Fibonacci數(shù)列和一個(gè)遞增數(shù)列.兩個(gè)類FibG和IncG都繼承于"抽象類"G,G實(shí)現(xiàn)生成器的"抽象"事件驅(qū)動(dòng)邏輯,而具體類FibG和IncG用來(lái)完成實(shí)際生成邏輯,全在代碼里啦:

復(fù)制代碼 代碼如下:

#!/usr/bin/ruby

require 'continuation'

#一個(gè)生成器"抽象"類
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來(lái)調(diào)用!
 end

 #@g_context實(shí)際為G的內(nèi)在驅(qū)動(dòng)器,其會(huì)反復(fù)回到g_loop中不斷生成新的數(shù)
 def g(v)
  callcc do |c|
   @g_context = c
   @main_context.call(v)
  end
 end
end

#具體的生成器類,用來(lái)生成Fibonacci數(shù)列
class FibG G
private
 #具體類實(shí)現(xiàn)g_loop,實(shí)際要怎么生成必須由具體類說(shuō)了算
 #g_loop不能直接由FibG的實(shí)例對(duì)象調(diào)用,而要通過(guò)G來(lái)驅(qū)動(dòng)
 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}

標(biāo)簽:克拉瑪依 南昌 甘孜 大慶 河池 棗莊 內(nèi)江 西雙版納

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器》,本文關(guān)鍵詞  Ruby,中,使用,連續(xù),體,Continuation,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章