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

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

熱門標(biāo)簽:如何利用高德地圖標(biāo)注家 武漢百應(yīng)人工智能電銷機(jī)器人 開通400電話申請流程 智能語音電銷的機(jī)器人 電腦外呼系統(tǒng)輻射大嗎 400手機(jī)電話免費辦理 揚州電銷外呼系統(tǒng)軟件 上海企業(yè)外呼系統(tǒng)排名 百度地圖標(biāo)注位置網(wǎng)站

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

1.resume的參數(shù)

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

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

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

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

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

[LUA-print] resume param

這很簡單,對吧,記住這個規(guī)則了,接下來不要混亂了。

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

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

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

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

復(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)用,同時yield函數(shù)我們傳遞了一個參數(shù)進(jìn)去。
而這個函數(shù)將作為resume的第二個返回值,前提是,resume函數(shù)的第一個返回值是true。
 
怎么樣?是不是開始有點混亂了?
沒關(guān)系,接下來更加混亂。

3.yield的返回值

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

復(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é)同程序會執(zhí)行一個for循環(huán),而我們也會調(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í)行的時候,協(xié)同程序第一次被掛起,所以yield的返回要等待第二次resume被調(diào)用時才能得到。

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

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

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

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

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

復(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ù)的最后加了一個返回值,僅僅是一個字符串。

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

所以,需要第三次執(zhí)行resume函數(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é)果沒變,第三次就有點特別。

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

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

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

5.結(jié)束

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

雖然暫時還沒了解這些規(guī)則的實際應(yīng)用,但,這必須得記錄下來,因為我很快就會混亂,到時候還得回頭看這篇文章吧~
 
好吧,已經(jīng)9點了…美好的周五晚上T_T

您可能感興趣的文章:
  • Lua協(xié)程(coroutine)程序運行分析
  • Lua的協(xié)程(coroutine)簡介
  • Lua之協(xié)同程序coroutine代碼實例
  • Lua協(xié)同程序(COROUTINE)運行步驟分解
  • Lua協(xié)同程序函數(shù)coroutine使用實例
  • Lua編程示例(七):協(xié)同程序基礎(chǔ)邏輯
  • 舉例詳解Lua中的協(xié)同程序編程
  • Lua中的協(xié)同程序詳解
  • Lua中的協(xié)同程序探究
  • Lua協(xié)同程序coroutine的簡介及優(yōu)缺點

標(biāo)簽:新余 嘉峪關(guān) 江西 武漢 黑龍江 延邊 宜賓 張掖

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究》,本文關(guān)鍵詞  Lua,中的,協(xié)同,程序,之,resume-yield,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章