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

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

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

    莊周夢蝶

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

    Ruby Fiber指南(二)參數(shù)傳遞

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

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

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

        首先,我們可以通過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 

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

        其次,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í)行過程:
    1、第6行第一次調(diào)用resume,傳入10,10兩個參數(shù)
    2、f開始執(zhí)行任務(wù),它的任務(wù)是調(diào)用Fiber#yield,并將參數(shù)相加和相減的結(jié)果作為參數(shù)給yield,也就是執(zhí)行Fiber.yield 20,10
    3、f調(diào)用yield之后掛起,返回root fiber,yield的兩個參數(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被忽略了,事實上如果還存在一次yield調(diào)用,那么3和4將被作為yield的返回結(jié)果使用,這就是我們接下來將看到的,通過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將被忽略,因為f的block不需要參數(shù),然后f執(zhí)行1 + Fiber.yield,在yield的掛起,加法運算沒有繼續(xù),因為yield的調(diào)用沒有參數(shù),因此第一次resume返回nil;第二次resume調(diào)用傳入2,這時候2將作為Fiber#yield的調(diào)用結(jié)果跟1相加,完成加法運算,得到的結(jié)果就是3,這個結(jié)果作為fiber的返回值返回給調(diào)用者。

        總結(jié)下上面我們談到的四種傳遞參數(shù)的情形:通過resume向fiber的block傳遞參數(shù)、通過yield向調(diào)用者傳遞參數(shù)、通過resume向yield傳遞參數(shù)、fiber返回值傳遞給調(diào)用者。
       
    主站蜘蛛池模板: 色爽黄1000部免费软件下载| 日韩一品在线播放视频一品免费| www亚洲精品久久久乳| 亚洲国产日韩一区高清在线 | 亚洲国产精品第一区二区三区 | 亚洲乱码一二三四区麻豆| 国产亚洲AV无码AV男人的天堂| 国产yw855.c免费视频| 成人在线视频免费| 4399好看日本在线电影免费| 免费91麻豆精品国产自产在线观看| 特黄特色的大片观看免费视频| 亚洲精品无码专区在线| 亚洲人成小说网站色| 亚洲成人网在线观看| 久久亚洲精品成人无码网站| 亚洲av综合av一区| 亚洲精品国产精品乱码不卡√| 亚洲毛片不卡av在线播放一区| 国产乱子伦片免费观看中字| 日韩一区二区三区免费体验| 毛片a级毛片免费播放下载| 成视频年人黄网站免费视频| 国产免费不卡视频| 色se01短视频永久免费| 黄色网址免费观看| 国产精彩免费视频| 中文字幕乱码免费视频| 在线观看无码AV网站永久免费| 国产乱子精品免费视观看片| 国产黄色免费网站| 最近最新的免费中文字幕| 无码人妻一区二区三区免费| 毛片高清视频在线看免费观看| 一二三四视频在线观看中文版免费| 我的小后妈韩剧在线看免费高清版 | 久久久久久久岛国免费播放| 免费网站看av片| 久久国产色AV免费看| 9420免费高清在线视频| 精品香蕉在线观看免费|