莊周夢(mèng)蝶

          生活、程序、未來(lái)
             :: 首頁(yè) ::  ::  :: 聚合  :: 管理

              Ruby Fiber指南(一)基礎(chǔ)
              Ruby Fiber指南(二)參數(shù)傳遞
              Ruby Fiber指南(三)過(guò)濾器
              Ruby Fiber指南(四)迭代器
              Ruby Actor指南(五)實(shí)現(xiàn)Actor

              這一篇其實(shí)也算是Fiber編程的基礎(chǔ)篇,只不過(guò)參數(shù)傳遞算是一個(gè)比較重要的主題,因此獨(dú)立一節(jié)。參數(shù)傳遞發(fā)生在兩個(gè)Fiber之間,作為Fiber之間通訊的一個(gè)主要手段。

              首先,我們可以通過(guò)resume調(diào)用給Fiber的block傳遞參數(shù):
          1 #resume傳遞參數(shù)給fiber
          2 f=Fiber.new do |a,b,c|
          3    p a,b,c
          4 end
          5 
          6 f.resume(1,2,3)
          7 

          這個(gè)例子展示了怎么向fiber的block傳遞參數(shù),f這個(gè)fiber簡(jiǎn)單地將傳入的參數(shù)打印出來(lái)并終止。

              其次,F(xiàn)iber#yield也可以傳遞參數(shù)給調(diào)用resume作為返回結(jié)果,猜猜下面的代碼打印什么?

          1 #yield傳遞參數(shù)給resume
          2 f=Fiber.new do |a,b|
          3   Fiber.yield a+b,a-b
              p a,b
          4 end
          5 
          6 p f.resume(10,10)
          7 p f.resume(3,4)
          8 
          正確的答案是:
          [20, 0]
          10
          10
          [
          1010]
          讓我們分析下代碼的執(zhí)行過(guò)程:
          1、第6行第一次調(diào)用resume,傳入10,10兩個(gè)參數(shù)
          2、f開(kāi)始執(zhí)行任務(wù),它的任務(wù)是調(diào)用Fiber#yield,并將參數(shù)相加和相減的結(jié)果作為參數(shù)給yield,也就是執(zhí)行Fiber.yield 20,10
          3、f調(diào)用yield之后掛起,返回root fiber,yield的兩個(gè)參數(shù)10、20作為返回結(jié)果打印。
          4、第7行代碼,root fiber再次調(diào)用resume并傳入?yún)?shù),f被切入并執(zhí)行代碼p a,b,打印a、b,a和b仍然是上次調(diào)用保存的10,而非resume傳入的3和4。
          5、f執(zhí)行完畢,返回p a,b的結(jié)果作為resume結(jié)果,也就是[10,10]

              剛才看到上面yield向resume傳遞參數(shù)的例子中第二次調(diào)用resume的參數(shù)3和4被忽略了,事實(shí)上如果還存在一次yield調(diào)用,那么3和4將被作為yield的返回結(jié)果使用,這就是我們接下來(lái)將看到的,通過(guò)resume調(diào)用傳遞參數(shù)作為fiber中yield的返回結(jié)果:

          1 #resume傳遞參數(shù)給yield
          2 f=Fiber.new do
          3    1 + Fiber.yield
          4 end
          5 
          6 p f.resume(1)
          7 p f.resume(2)
          8 

          這次的打印結(jié)果將是:

          nil
          3
             第一次調(diào)用resume傳入的1將被忽略,因?yàn)閒的block不需要參數(shù),然后f執(zhí)行1 + Fiber.yield,在yield的掛起,加法運(yùn)算沒(méi)有繼續(xù),因?yàn)閥ield的調(diào)用沒(méi)有參數(shù),因此第一次resume返回nil;第二次resume調(diào)用傳入2,這時(shí)候2將作為Fiber#yield的調(diào)用結(jié)果跟1相加,完成加法運(yùn)算,得到的結(jié)果就是3,這個(gè)結(jié)果作為fiber的返回值返回給調(diào)用者。

              總結(jié)下上面我們談到的四種傳遞參數(shù)的情形:通過(guò)resume向fiber的block傳遞參數(shù)、通過(guò)yield向調(diào)用者傳遞參數(shù)、通過(guò)resume向yield傳遞參數(shù)、fiber返回值傳遞給調(diào)用者。
             
          主站蜘蛛池模板: 临澧县| 巴东县| 甘洛县| 怀宁县| 太仓市| 北票市| 丰宁| 长沙市| 务川| 临邑县| 游戏| 屏南县| 苏尼特左旗| 翁源县| 安国市| 图们市| 新龙县| 伊吾县| 休宁县| 永安市| 南昌市| 屯留县| 通榆县| 望谟县| 赣州市| 莱芜市| 辽宁省| 拜泉县| 集贤县| 武胜县| 会同县| 依兰县| 黔江区| 红河县| 全椒县| 咸丰县| 北碚区| 安顺市| 康定县| 谢通门县| 万源市|