<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

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

    Ruby Fiber指南(二)參數傳遞

    Posted on 2010-03-11 18:41 dennis 閱讀(3727) 評論(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返回值傳遞給調用者。
       
    主站蜘蛛池模板: 热99RE久久精品这里都是精品免费 | 特级aa**毛片免费观看| 亚洲国产精品免费观看| 亚洲黄网站wwwwww| 黄网站色在线视频免费观看| 777亚洲精品乱码久久久久久 | 亚洲中字慕日产2021| 成人特黄a级毛片免费视频| 亚洲情A成黄在线观看动漫软件| 免费精品国产自产拍在| 亚洲自偷自偷在线成人网站传媒| 中文字幕av无码无卡免费| 亚洲熟妇AV一区二区三区浪潮| 永久免费毛片手机版在线看| 无码亚洲成a人在线观看| 免费在线观看视频a| 一级毛片**免费看试看20分钟| 日韩精品亚洲aⅴ在线影院| 99久久精品毛片免费播放| 久久精品国产亚洲AV大全| 国产又黄又爽又猛免费app| 亚洲jizzjizz少妇| 久久99亚洲综合精品首页| 免费网站看av片| 亚洲入口无毒网址你懂的| 四虎免费永久在线播放| 91成人免费福利网站在线| 亚洲制服中文字幕第一区| 亚洲成在人线aⅴ免费毛片| 激情无码亚洲一区二区三区 | 一个人免费高清在线观看| 国产精品日本亚洲777| 亚洲国产精品无码专区影院| 99久久国产热无码精品免费| 看全免费的一级毛片| 亚洲三级电影网址| 国产免费拔擦拔擦8x| 一级成人a毛片免费播放| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 污网站免费在线观看| 亚洲精品第五页中文字幕|