高階話題
1.疊代
1.1 執行個體代碼:
--疊代
local function enum(array)
local index = 1
return function()
local ret = array[index]
index = index + 1
return ret
end
end
local function foreach(array,action)
for element in enum(array)do
action(element)
end
end
foreach({1,2,3},print)
輸出結果:
1
2
3
1.2 有關疊代的描述:
- 定義
疊代是for語句的一種特殊形式,可以通過for語句驅動疊代函數對一個給定集合進行周遊。正式、完備的文法說明較複雜,請參考Lua手冊。
- 實作
如前面代碼所示:enum函數傳回一個匿名的疊代函數,for語句每次調用該疊代函數都得到一個值(通過element變量引用),若該值為nil,則for循環結束。
2.協作線程
2.1 執行個體代碼
--線程
local function producer()
return coroutine.create(
function(salt)
local t = {1,2,3}
for i = 1,#t do
salt = coroutine.yield(t[i] + salt)
end
end
)
end
function consumer(prod)
local salt = 10
while true do
local running ,product = coroutine.resume(prod, salt)
salt = salt*salt
if running then
print(product or "END!")
else
break
end
end
end
consumer(producer())
輸出結果:
11
102
10003
END!
2.2 有關協作線程的描述:
- 建立協作線程
通過coroutine.create可以建立一個協作線程,該函數接收一個函數類型的參數作為線程的執行體,傳回一個線程對象。
- 啟動線程
通過coroutine.resume可以啟動一個線程或者繼續一個挂起的線程。該函數接收一個線程對象以及其他需要傳遞給該線程的參數。線程可以通過線程函數的參數或者coroutine.yield調用的傳回值來擷取這些參數。當線程初次執行時,resume傳遞的參數通過線程函數的參數傳遞給線程,線程從線程函數開始執行;當線程由挂起轉為執行時,resume傳遞的參數以yield調用傳回值的形式傳遞給線程,線程從yield調用後繼續執行
- 線程放棄排程
線程調用coroutine.yield暫停自己的執行,并把執行權傳回給啟動/繼續它的線程;線程還可利用yield傳回一些值給後者,這些值以resume調用的傳回值的形式傳回。
附錄 常用的Lua參考資料
lua 論壇(lua 中國開發者 luaer中國官司方網站)
Lua參考手冊(最正式、權威的Lua文檔)
Lua程式設計(線上版,同樣具權威性的Lua教科書)
Lua正式網站的文檔頁面(包含很多有價值的文檔資料連結)
Lua維基(最全面的Lua維基百科)
LuaForge(最豐富的Lua開源代碼基地)
參考文獻《C/C++程式員的Lua快速入門》