亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2015年01月06日 11:14:15   投稿:junjie  
這篇文章主要介紹了Ruby中使用連續(xù)體Continuation實(shí)現(xiàn)生成器,本文先是介紹了生成器的概念,然后給出實(shí)現(xiàn)代碼,需要的朋友可以參考下

ruby中有很多經(jīng)典的驅(qū)動(dòng)器結(jié)構(gòu),比如枚舉器和生成器等.這次簡單介紹下生成器的概念.生成器是按照功能要求,一次產(chǎn)生一個(gè)對(duì)象,或稱之為生成一個(gè)對(duì)象的方法.ruby中的連續(xù)體正好可以用來完成生成器的功能.連續(xù)體說起來晦澀,其實(shí)還是很簡單的,它有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í)例代碼,我加了注釋.該代碼用來生成Fibonacci數(shù)列和一個(gè)遞增數(shù)列.兩個(gè)類FibG和IncG都繼承于"抽象類"G,G實(shí)現(xiàn)生成器的"抽象"事件驅(qū)動(dòng)邏輯,而具體類FibG和IncG用來完成實(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來調(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

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

相關(guān)文章

  • Ruby在cmd下中文顯示亂碼以及不支持OpenSSL的問題解決

    Ruby在cmd下中文顯示亂碼以及不支持OpenSSL的問題解決

    這篇文章主要介紹了Ruby在cmd下中文顯示亂碼以及不支持OpenSSL的問題解決,其中OpenSSL的相關(guān)編譯操作在Linux環(huán)境下進(jìn)行,需要的朋友可以參考下
    2015-11-11
  • Ruby實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者代碼分享

    Ruby實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者代碼分享

    這篇文章主要介紹了Ruby實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05
  • Ruby中的Mechanize的使用教程

    Ruby中的Mechanize的使用教程

    這篇文章主要介紹了Ruby中的Mechanize的使用教程,Mechanize一般用來抓取網(wǎng)頁,可以模擬點(diǎn)擊事件、表單提交提交等操作行為,需要的朋友可以參考下
    2015-01-01
  • Ruby中關(guān)于hash的基本使用方法

    Ruby中關(guān)于hash的基本使用方法

    這篇文章主要介紹了Ruby中關(guān)于hash的基本使用方法,包括哈希的創(chuàng)建和一些內(nèi)置方法的使用,需要的朋友可以參考下
    2015-05-05
  • web 應(yīng)用中常用的各種 cache詳解

    web 應(yīng)用中常用的各種 cache詳解

    cache是提高應(yīng)用性能重要的一個(gè)環(huán)節(jié),寫篇文章總結(jié)一下用過的各種對(duì)于動(dòng)態(tài)內(nèi)容的cache。
    2014-06-06
  • 關(guān)于Ruby on Rails視圖編寫的一些建議

    關(guān)于Ruby on Rails視圖編寫的一些建議

    這篇文章主要介紹了關(guān)于Ruby on Rails視圖編寫的一些建議,有助于團(tuán)隊(duì)協(xié)作時(shí)對(duì)代碼的調(diào)試工作,需要的朋友可以參考下
    2015-08-08
  • 舉例初步講解Ruby中的正則表達(dá)式

    舉例初步講解Ruby中的正則表達(dá)式

    這篇文章主要介紹了Ruby中的正則表達(dá)式,是Ruby學(xué)習(xí)進(jìn)階當(dāng)中的重要知識(shí),需要的朋友可以參考下
    2015-05-05
  • ruby開發(fā)vim插件小結(jié)

    ruby開發(fā)vim插件小結(jié)

    作為一個(gè)Vimmer和Pythoner,之前折騰過用python編寫vim插件?,F(xiàn)在作為半個(gè)Rubist,又開始繼續(xù)折騰。
    2014-07-07
  • win7安裝ruby on rails開發(fā)環(huán)境

    win7安裝ruby on rails開發(fā)環(huán)境

    看到很多文章都說ruby環(huán)境在windows上是非常難搭建,會(huì)出現(xiàn)各種各樣的怪問題,所以都推薦到linux和mac上安裝開發(fā)。但是我按照教程搭了下,問題也不算太多??傔^大概花費(fèi)了2個(gè)半小時(shí)左右就完成了。下面就把安裝的步驟及具體的版本記錄了一下供大家參考。
    2014-07-07
  • ruby的程序結(jié)構(gòu)介紹

    ruby的程序結(jié)構(gòu)介紹

    這篇文章主要介紹了ruby的程序結(jié)構(gòu)介紹,本文講解了源文件、模塊、控制結(jié)構(gòu)、方法定義、類及對(duì)象等內(nèi)容,需要的朋友可以參考下
    2015-05-05

最新評(píng)論