a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Ruby > 正文

Ruby中使用連續體Continuation實現生成器

2020-10-29 19:42:52
字體:
來源:轉載
供稿:網友

ruby中有很多經典的驅動器結構,比如枚舉器和生成器等.這次簡單介紹下生成器的概念.生成器是按照功能要求,一次產生一個對象,或稱之為生成一個對象的方法.ruby中的連續體正好可以用來完成生成器的功能.連續體說起來晦澀,其實還是很簡單的,它有3個特點:

1. callcc方法會給代碼塊傳一個連續體對象,你可以保存該對象;
2. 當調用連續體的call方法時指令流會跳轉到callcc方法之后;
3. 如果給連續體的call方法傳遞對象,則callcc方法會返回該對象,如果不傳遞對象,callcc會返回nil.

我們下面參考一段實例代碼,我加了注釋.該代碼用來生成Fibonacci數列和一個遞增數列.兩個類FibG和IncG都繼承于"抽象類"G,G實現生成器的"抽象"事件驅動邏輯,而具體類FibG和IncG用來完成實際生成邏輯,全在代碼里啦:

復制代碼 代碼如下:

#!/usr/bin/ruby

require 'continuation'

#一個生成器"抽象"類
class G
 def initialize
  do_g
 end
 
 #@main_context實際是next的"出口",讓next返回@main_context.call(v)的值,即生成的數
 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 #虛方法,由實際具體類實現,但由G來調用!
 end

 #@g_context實際為G的內在驅動器,其會反復回到g_loop中不斷生成新的數
 def g(v)
  callcc do |c|
   @g_context = c
   @main_context.call(v)
  end
 end
end

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日本视频在线播放 | а天堂中文最新一区二区三区 | 超碰97在线播放 | 色综合久久88色综合天天6 | 色播开心网 | 日日夜夜狠狠 | 成年人精品视频在线观看 | 欧美成人一区二区三区片免费 | 亚洲综合第一页 | 一级在线毛片 | 欧洲成人午夜免费大片 | 日韩成人在线观看 | 偷拍自拍亚洲 | 秋霞久久久 | 一级毛片免费播放 | 爱爱爱av | 91亚洲高清 | 亚洲国产精品一区二区久久 | 天久久| 欧美视频一区二区三区 | 九九综合| 精品一区二区在线观看 | 成人一区二区三区 | 综合久| 草逼一区 | 国产一级在线 | 亚洲三级在线播放 | 亚洲精品久久久久久久久久久久久 | 国产免费成人在线 | 成人免费一区二区三区 | 亚洲精品免费视频 | sese综合 | 夜夜操com| 欧美大片在线 | 亚洲精品一区在线观看 | 国产剧情一区二区 | 国产欧美精品一区aⅴ影院 日韩精品区 | 欧美精品久久久久久久宅男 | 综合伊人| 久久精品av| 亚洲欧洲精品一区二区三区 |