亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

 更新時(shí)間:2014年09月13日 11:08:02   作者:笨木頭  
這篇文章主要介紹了Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究本文講解了resume的參數(shù)、resume函數(shù)的第二個(gè)返回值、yield的返回值等內(nèi)容,需要的朋友可以參考下

這次要介紹幾個(gè)其實(shí)很簡(jiǎn)單,但是一定要小心的返回值規(guī)則。

1.resume的參數(shù)

resume函數(shù)除了第一個(gè)參數(shù)是協(xié)同程序外,還能繼續(xù)傳其他參數(shù),如下代碼:

復(fù)制代碼 代碼如下:

    local co = coroutine.create(function(name)
        print(name);
    end);
    coroutine.resume(co, "resume param");

resume第二個(gè)參數(shù)為“resume parame”,這個(gè)參數(shù)將會(huì)傳遞給協(xié)同程序的函數(shù)。
輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] resume param

這很簡(jiǎn)單,對(duì)吧,記住這個(gè)規(guī)則了,接下來(lái)不要混亂了。

2.resume函數(shù)的第二個(gè)返回值

還記得resume函數(shù)的兩個(gè)返回值嗎?一個(gè)代表協(xié)同程序是否正確執(zhí)行,一個(gè)代表錯(cuò)誤信息。

那,如果協(xié)同程序正確執(zhí)行,錯(cuò)誤信息這個(gè)返回值自然就是nil了。

然后,這里還有一個(gè)規(guī)則,那就是yield函數(shù)的參數(shù)可以傳遞到resume的第二個(gè)返回值里。
 
如下代碼:

復(fù)制代碼 代碼如下:

    local co = coroutine.create(function(name)
        print(name);
        coroutine.yield("yield param");
    end);
    local result, msg = coroutine.resume(co, "resume param");
    print("msg:" .. msg);

輸出結(jié)果如下:
復(fù)制代碼 代碼如下:

[LUA-print] resume param
[LUA-print] msg:yield param

這次我們只是加了一句yield的調(diào)用,同時(shí)yield函數(shù)我們傳遞了一個(gè)參數(shù)進(jìn)去。
而這個(gè)函數(shù)將作為resume的第二個(gè)返回值,前提是,resume函數(shù)的第一個(gè)返回值是true。
 
怎么樣?是不是開(kāi)始有點(diǎn)混亂了?
沒(méi)關(guān)系,接下來(lái)更加混亂。

3.yield的返回值

這次輪到y(tǒng)ield的返回值了,來(lái)看看下面的代碼:

復(fù)制代碼 代碼如下:

    local co = coroutine.create(function(name)
        for i = 1, 2, 1 do
            print(name);
            print("co:" .. coroutine.yield("yield param"));
        end
    end);
    for i = 1, 2, 1 do
        print("=========第" .. i .. "次執(zhí)行:")
        local result, msg = coroutine.resume(co, "resume param");
        print("msg:" .. msg);
    end

這次的協(xié)同程序會(huì)執(zhí)行一個(gè)for循環(huán),而我們也會(huì)調(diào)用兩次resume函數(shù),輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] =========第1次執(zhí)行:
[LUA-print] resume param
[LUA-print] msg:yield param
[LUA-print] =========第2次執(zhí)行:
[LUA-print] co:resume param
[LUA-print] resume param
[LUA-print] msg:yield param

第一次執(zhí)行的時(shí)候,協(xié)同程序第一次被掛起,所以yield的返回要等待第二次resume被調(diào)用時(shí)才能得到。

于是,第二次調(diào)用resume時(shí),首先就得到了上一次yield的返回值了,這個(gè)返回值正是resume的第二個(gè)參數(shù)。
 
沒(méi)錯(cuò),resume的第二個(gè)返回值是yield的參數(shù),而yield的返回值,是resume的第二個(gè)參數(shù)。

再簡(jiǎn)單一些,resume的返回值是yield的參數(shù),yield的返回值是resume的參數(shù)。
同時(shí),resume的第二個(gè)參數(shù)也能傳遞給協(xié)同程序的函數(shù)。
 
怎么樣?稍微有點(diǎn)點(diǎn)混亂了吧?

沒(méi)關(guān)系喇,更混亂的情況還會(huì)接著發(fā)生的,呵呵。(小若:呵呵你個(gè)頭啊,我走了)

4.協(xié)同程序結(jié)束,主函數(shù)的返回值

這最后一種情況了,那就是協(xié)同程序的函數(shù)返回值,沒(méi)錯(cuò),它也能有返回值。
先看代碼:

復(fù)制代碼 代碼如下:

    local co = coroutine.create(function(name)
        for i = 1, 2, 1 do
            print(name);
            print("co:" .. coroutine.yield("yield param"));
        end
        return "協(xié)同程序函數(shù)結(jié)束喇!"
    end);
    for i = 1, 3, 1 do
        print("=========第" .. i .. "次執(zhí)行:")
        local result, msg = coroutine.resume(co, "resume param");
        print("msg:" .. msg);
    end

我在協(xié)同程序函數(shù)的最后加了一個(gè)返回值,僅僅是一個(gè)字符串。

而resume的調(diào)用我增加到了3次,這是因?yàn)閰f(xié)同程序的for循環(huán)會(huì)執(zhí)行兩次,也就是會(huì)調(diào)用yield兩次。

所以,需要第三次執(zhí)行resume函數(shù)時(shí),第二次yield才能得到返回。
 
輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] =========第1次執(zhí)行:
[LUA-print] resume param
[LUA-print] msg:yield param
[LUA-print] =========第2次執(zhí)行:
[LUA-print] co:resume param
[LUA-print] resume param
[LUA-print] msg:yield param
[LUA-print] =========第3次執(zhí)行:
[LUA-print] co:resume param
[LUA-print] msg:協(xié)同程序函數(shù)結(jié)束喇!

前兩次的執(zhí)行結(jié)果沒(méi)變,第三次就有點(diǎn)特別。

第三次執(zhí)行resume時(shí),首先就得到了第二次yield的返回,輸出“co:resume param”。

注意一下,這里是不會(huì)繼續(xù)執(zhí)行print(name);這句代碼的,也就是說(shuō),整個(gè)協(xié)同程序函數(shù)的for循環(huán)是不會(huì)被執(zhí)行的。

這里僅僅是第二次的yield函數(shù)返回了結(jié)果,這個(gè)可不能理解錯(cuò)了。
 
最后,協(xié)同程序函數(shù)返回一個(gè)字符串,這個(gè)字符串做成為resume函數(shù)的第二個(gè)返回值。
是的,當(dāng)協(xié)同程序執(zhí)行完畢時(shí),resume的第二個(gè)返回值就不再是yield的參數(shù)了。

5.結(jié)束

好了,這就是我今天不小心掃了幾眼后,就不得不仔細(xì)研究的地方了。

雖然暫時(shí)還沒(méi)了解這些規(guī)則的實(shí)際應(yīng)用,但,這必須得記錄下來(lái),因?yàn)槲液芸炀蜁?huì)混亂,到時(shí)候還得回頭看這篇文章吧~
 
好吧,已經(jīng)9點(diǎn)了…美好的周五晚上T_T

相關(guān)文章

  • Lua中的源代碼預(yù)編譯淺析

    Lua中的源代碼預(yù)編譯淺析

    這篇文章主要介紹了Lua中的源代碼預(yù)編譯淺析,Lua確實(shí)允許在運(yùn)行源代碼之前,將源代碼預(yù)編譯成一種中間形式(類(lèi)比Python的.pyc),需要的朋友可以參考下
    2014-09-09
  • Lua面向?qū)ο缶幊虒W(xué)習(xí)筆記

    Lua面向?qū)ο缶幊虒W(xué)習(xí)筆記

    這篇文章主要介紹了Lua面向?qū)ο缶幊虒W(xué)習(xí)筆記,本文講解了Lua中實(shí)現(xiàn)類(lèi)的例子、類(lèi)之間繼承的例子等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • Cocos2d-x中調(diào)用Lua及HelloWorld.lua源碼分解

    Cocos2d-x中調(diào)用Lua及HelloWorld.lua源碼分解

    這篇文章主要介紹了Cocos2d-x中調(diào)用Lua及HelloWorld.lua源碼分解,本文最后總結(jié)了一些Lua的語(yǔ)法,需要的朋友可以參考下
    2014-09-09
  • Lua中的弱引用介紹

    Lua中的弱引用介紹

    這篇文章主要介紹了Lua中的弱引用介紹,本文用一個(gè)實(shí)例講解了Lua弱引用的相關(guān)知識(shí),需要的朋友可以參考下
    2015-04-04
  • Lua編程示例(五): C語(yǔ)言對(duì)Lua表的讀取和添加

    Lua編程示例(五): C語(yǔ)言對(duì)Lua表的讀取和添加

    這篇文章主要介紹了Lua編程示例(五): C語(yǔ)言對(duì)Lua表的讀取和添加,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-07-07
  • Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法

    Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法,類(lèi)似JavaScript中eval函數(shù)的功能,在Lua中也可以實(shí)現(xiàn),需要的朋友可以參考下
    2015-05-05
  • Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

    Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

    這篇文章主要介紹了Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究本文講解了resume的參數(shù)、resume函數(shù)的第二個(gè)返回值、yield的返回值等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • lua 基礎(chǔ)教程

    lua 基礎(chǔ)教程

    Lua 的語(yǔ)法比較簡(jiǎn)單,學(xué)習(xí)起來(lái)也比較省力,但功能卻并不弱。所以,我只簡(jiǎn)單的歸納一下Lua的一些語(yǔ)法規(guī)則,使用起來(lái)方便好查就可以了。估計(jì)看完了,就懂得怎么寫(xiě)Lua程序了。
    2015-09-09
  • Lua和C++的通信流程代碼實(shí)例

    Lua和C++的通信流程代碼實(shí)例

    這篇文章主要介紹了Lua和C++的通信流程代碼實(shí)例,本文是上一篇的DEMO,本文用代碼講解Lua和C++之間的通信,需要的朋友可以參考下
    2014-09-09
  • lua獲取未來(lái)某時(shí)間點(diǎn)的時(shí)間戳解決方案

    lua獲取未來(lái)某時(shí)間點(diǎn)的時(shí)間戳解決方案

    這篇文章主要介紹了lua獲取未來(lái)某時(shí)間點(diǎn)的時(shí)間戳解決方案,需要的朋友可以參考下
    2014-12-12

最新評(píng)論