看了好幾次協同程式都始終沒能搞懂其中resume是如何與yield進行資料交流的,今天終於看懂了,讓我們從頭說起
coroutine.create( )
建立coroutine,返回coroutine, 引數是乙個函式,當和resume配合使用的時候就喚醒函式呼叫
coroutine.resume( )
重啟coroutine,和create配合使用
coroutine.yield()
掛起coroutine,將coroutine設定為掛起狀態,這個和resume配合使用能有很多有用的效果
coroutine.status( )
檢視coroutine的狀態
coroutine.wrap()
建立coroutine,返回乙個函式,一旦你呼叫這個函式,就進入coroutine,和create功能重複
coroutine.running()
返回正在跑的coroutine,乙個coroutine就是乙個執行緒,當使用running的時候,就是返回乙個corouting的執行緒號
function foo (a)
print("foo 函式輸出", a)
return coroutine.yield(2 * a) -- 返回 2*a 的值
end
co = coroutine.create(function (a , b)
print("第一次協同程式執行輸出", a, b) -- co-body 1 10
local r = foo(a + 1)
print("第二次協同程式執行輸出", r)
local r, s = coroutine.yield(a + b, a - b) -- a,b的值為第一次呼叫協同程式時傳入
print("第三次協同程式執行輸出", r, s)
return b, "結束協同程式" -- b的值為第二次呼叫協同程式時傳入
end)
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割線----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---分割線---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---分割線---")
print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
print("---分割線---")
上面**的輸出如下
第一次協同程式執行輸出 1 10
foo 函式輸出 2
main true 4
--分割線----
第二次協同程式執行輸出 r
main true 11 -9
---分割線---
第三次協同程式執行輸出 x y
main true 10 結束協同程式
---分割線---
main false cannot resume dead coroutine
---分割線---
第乙個分割線之前的內容很好理解,resume呼叫時,引數傳遞分兩種情況,一種是第一次,把引數傳遞給協程主程式,之後的resume就把引數傳遞給yield函式,繼續協程函式執行。
首先第一次傳遞引數給主程式,呼叫foo 輸出2,遇到yield,協程返回狀態和yield的引數 main true 4。
然後第二次resume,傳遞引數是「r」,這時候協程從上次yield的地方開始繼續執行,也就是第乙個local r的賦值,此時傳遞引數是字串「r」,那麼yield的引數就是「r」,local r的值就被賦值成了字串。之後的x,y也同理
最後函式執行結束返回return之後,這時再去呼叫resume,因為程式已經結束了,所以是dead狀態,返回false
這段程式的關鍵就在於,第一次之後每次resume的引數都作為上次掛起時候yield的返回值,可以在程式內繼續賦值,相當於傳遞引數,而yield本身相當於是暫時性的return語句,yield本身的引數用來做resume函式的返回值,yield(a,b)也就相當於是return a,b
這就是之前很繞的一段話:resume的引數是yield的返回值,yield的引數是resume的返回值。真的太繞了。。。
programming in lua 第五章筆記
當乙個函式只有乙個引數,而且這個引數的型別是字串或者table,那麼函式的 可以省略 函式的引數是乙個local變數 lua函式可以返回多個返回值 s,e string.find hello lua users lua print s,e 7 9 可以強制函式只返回1個返回值 print foo0 ...
programming in lua 第一章筆記
1.命令列執行lua 檔案 lua hello.lua 2.命令列輸入lua會獲得lua版本資訊 並進入互動模式 lua 退出命令列模式 ctrl d unix,ctrl z windows 或者呼叫os.exit 可以使用 i來讓lua先進入互動模式 再執行lua檔案 lua i test.lua...
協同辦公協同的到底是什麼?
偶然間想到這個問題,於是便試著去回答。從字面理解,協同就是共同協作,也就是說協同辦公作用的物件是兩個或者多個個體,這些物件共同處理完成某項工作或某個任務。可仔細一想不對啊,很多的工作是不需要多個人去合作完成的,比如說我,我是文案人員,所以我只需要把東西寫好就可以了,根本不需要跟別人合作嘛。那協同辦公...