莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Ruby Fiber指南(二)參數傳遞

          Posted on 2010-03-11 18:41 dennis 閱讀(3732) 評論(0)  編輯  收藏 所屬分類: 動態語言my open-source

              Ruby Fiber指南(一)基礎
              Ruby Fiber指南(二)參數傳遞
              Ruby Fiber指南(三)過濾器
              Ruby Fiber指南(四)迭代器
              Ruby Actor指南(五)實現Actor

              這一篇其實也算是Fiber編程的基礎篇,只不過參數傳遞算是一個比較重要的主題,因此獨立一節。參數傳遞發生在兩個Fiber之間,作為Fiber之間通訊的一個主要手段。

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

          這個例子展示了怎么向fiber的block傳遞參數,f這個fiber簡單地將傳入的參數打印出來并終止。

              其次,Fiber#yield也可以傳遞參數給調用resume作為返回結果,猜猜下面的代碼打印什么?

          1 #yield傳遞參數給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]
          讓我們分析下代碼的執行過程:
          1、第6行第一次調用resume,傳入10,10兩個參數
          2、f開始執行任務,它的任務是調用Fiber#yield,并將參數相加和相減的結果作為參數給yield,也就是執行Fiber.yield 20,10
          3、f調用yield之后掛起,返回root fiber,yield的兩個參數10、20作為返回結果打印。
          4、第7行代碼,root fiber再次調用resume并傳入參數,f被切入并執行代碼p a,b,打印a、b,a和b仍然是上次調用保存的10,而非resume傳入的3和4。
          5、f執行完畢,返回p a,b的結果作為resume結果,也就是[10,10]

              剛才看到上面yield向resume傳遞參數的例子中第二次調用resume的參數3和4被忽略了,事實上如果還存在一次yield調用,那么3和4將被作為yield的返回結果使用,這就是我們接下來將看到的,通過resume調用傳遞參數作為fiber中yield的返回結果:

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

          這次的打印結果將是:

          nil
          3
             第一次調用resume傳入的1將被忽略,因為f的block不需要參數,然后f執行1 + Fiber.yield,在yield的掛起,加法運算沒有繼續,因為yield的調用沒有參數,因此第一次resume返回nil;第二次resume調用傳入2,這時候2將作為Fiber#yield的調用結果跟1相加,完成加法運算,得到的結果就是3,這個結果作為fiber的返回值返回給調用者。

              總結下上面我們談到的四種傳遞參數的情形:通過resume向fiber的block傳遞參數、通過yield向調用者傳遞參數、通過resume向yield傳遞參數、fiber返回值傳遞給調用者。
             
          主站蜘蛛池模板: 徐闻县| 贺兰县| 夏津县| 青州市| 东兰县| 西丰县| 台安县| 开江县| 诸暨市| 田东县| 启东市| 济源市| 峨山| 额济纳旗| 灌云县| 余姚市| 肥城市| 栖霞市| 大埔县| 聊城市| 阿拉善盟| 井陉县| 高淳县| 浦城县| 东丰县| 鞍山市| 保定市| 尖扎县| 永顺县| 兰溪市| 临城县| 临沭县| 浪卡子县| 常宁市| 舒城县| 平远县| 林芝县| 天气| 商都县| 濮阳市| 大英县|