這次要介紹幾個其實很簡單,但是一定要小心的返回值規則。
1.resume的參數
resume函數除了第一個參數是協同程序外,還能繼續傳其他參數,如下代碼:
復制代碼 代碼如下:
local co = coroutine.create(function(name)
print(name);
end);
coroutine.resume(co, "resume param");
resume第二個參數為“resume parame”,這個參數將會傳遞給協同程序的函數。
輸出結果如下:
復制代碼 代碼如下:
[LUA-print] resume param
這很簡單,對吧,記住這個規則了,接下來不要混亂了。
2.resume函數的第二個返回值
還記得resume函數的兩個返回值嗎?一個代表協同程序是否正確執行,一個代表錯誤信息。
那,如果協同程序正確執行,錯誤信息這個返回值自然就是nil了。
然后,這里還有一個規則,那就是yield函數的參數可以傳遞到resume的第二個返回值里。
如下代碼:
復制代碼 代碼如下:
local co = coroutine.create(function(name)
print(name);
coroutine.yield("yield param");
end);
local result, msg = coroutine.resume(co, "resume param");
print("msg:" .. msg);
輸出結果如下:
復制代碼 代碼如下:
[LUA-print] resume param
[LUA-print] msg:yield param
這次我們只是加了一句yield的調用,同時yield函數我們傳遞了一個參數進去。
而這個函數將作為resume的第二個返回值,前提是,resume函數的第一個返回值是true。
怎么樣?是不是開始有點混亂了?
沒關系,接下來更加混亂。
3.yield的返回值
這次輪到yield的返回值了,來看看下面的代碼:
復制代碼 代碼如下:
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 .. "次執行:")
local result, msg = coroutine.resume(co, "resume param");
print("msg:" .. msg);
end
這次的協同程序會執行一個for循環,而我們也會調用兩次resume函數,輸出結果如下:
復制代碼 代碼如下:
[LUA-print] =========第1次執行:
[LUA-print] resume param
[LUA-print] msg:yield param
[LUA-print] =========第2次執行:
[LUA-print] co:resume param
[LUA-print] resume param
[LUA-print] msg:yield param
第一次執行的時候,協同程序第一次被掛起,所以yield的返回要等待第二次resume被調用時才能得到。
于是,第二次調用resume時,首先就得到了上一次yield的返回值了,這個返回值正是resume的第二個參數。
沒錯,resume的第二個返回值是yield的參數,而yield的返回值,是resume的第二個參數。
再簡單一些,resume的返回值是yield的參數,yield的返回值是resume的參數。
同時,resume的第二個參數也能傳遞給協同程序的函數。
怎么樣?稍微有點點混亂了吧?
沒關系喇,更混亂的情況還會接著發生的,呵呵。(小若:呵呵你個頭啊,我走了)
4.協同程序結束,主函數的返回值
這最后一種情況了,那就是協同程序的函數返回值,沒錯,它也能有返回值。
先看代碼:
復制代碼 代碼如下:
local co = coroutine.create(function(name)
for i = 1, 2, 1 do
print(name);
print("co:" .. coroutine.yield("yield param"));
end
return "協同程序函數結束喇!"
end);
for i = 1, 3, 1 do
print("=========第" .. i .. "次執行:")
local result, msg = coroutine.resume(co, "resume param");
print("msg:" .. msg);
end
我在協同程序函數的最后加了一個返回值,僅僅是一個字符串。
而resume的調用我增加到了3次,這是因為協同程序的for循環會執行兩次,也就是會調用yield兩次。
所以,需要第三次執行resume函數時,第二次yield才能得到返回。
輸出結果如下:
復制代碼 代碼如下:
[LUA-print] =========第1次執行:
[LUA-print] resume param
[LUA-print] msg:yield param
[LUA-print] =========第2次執行:
[LUA-print] co:resume param
[LUA-print] resume param
[LUA-print] msg:yield param
[LUA-print] =========第3次執行:
[LUA-print] co:resume param
[LUA-print] msg:協同程序函數結束喇!
前兩次的執行結果沒變,第三次就有點特別。
第三次執行resume時,首先就得到了第二次yield的返回,輸出“co:resume param”。
注意一下,這里是不會繼續執行print(name);這句代碼的,也就是說,整個協同程序函數的for循環是不會被執行的。
這里僅僅是第二次的yield函數返回了結果,這個可不能理解錯了。
最后,協同程序函數返回一個字符串,這個字符串做成為resume函數的第二個返回值。
是的,當協同程序執行完畢時,resume的第二個返回值就不再是yield的參數了。
5.結束
好了,這就是我今天不小心掃了幾眼后,就不得不仔細研究的地方了。
雖然暫時還沒了解這些規則的實際應用,但,這必須得記錄下來,因為我很快就會混亂,到時候還得回頭看這篇文章吧~
好吧,已經9點了…美好的周五晚上T_T
您可能感興趣的文章:- Lua協程(coroutine)程序運行分析
- Lua的協程(coroutine)簡介
- Lua之協同程序coroutine代碼實例
- Lua協同程序(COROUTINE)運行步驟分解
- Lua協同程序函數coroutine使用實例
- Lua編程示例(七):協同程序基礎邏輯
- 舉例詳解Lua中的協同程序編程
- Lua中的協同程序詳解
- Lua中的協同程序探究
- Lua協同程序coroutine的簡介及優缺點