Lua 學(xué)習(xí)筆記之三(高階話題)

2022-06-25 15:38 更新

高階話題

1.迭代

1.1  實(shí)例代碼:

    --迭代
    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)

輸出結(jié)果:

1

2

3

1.2  有關(guān)迭代的描述:

  • 定義

迭代是for語(yǔ)句的一種特殊形式,可以通過(guò)for語(yǔ)句驅(qū)動(dòng)迭代函數(shù)對(duì)一個(gè)給定集合進(jìn)行遍歷。正式、完備的語(yǔ)法說(shuō)明較復(fù)雜,請(qǐng)參考Lua手冊(cè)。

  • 實(shí)現(xiàn)

如前面代碼所示:enum函數(shù)返回一個(gè)匿名的迭代函數(shù),for語(yǔ)句每次調(diào)用該迭代函數(shù)都得到一個(gè)值(通過(guò)element變量引用),若該值為nil,則for循環(huán)結(jié)束。 

2.協(xié)作線程 

2.1  實(shí)例代碼

    --線程
    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())

輸出結(jié)果:

11

102

10003

END!

2.2  有關(guān)協(xié)作線程的描述:

  • 創(chuàng)建協(xié)作線程

通過(guò)coroutine.create可以創(chuàng)建一個(gè)協(xié)作線程,該函數(shù)接收一個(gè)函數(shù)類型的參數(shù)作為線程的執(zhí)行體,返回一個(gè)線程對(duì)象。

  • 啟動(dòng)線程

通過(guò)coroutine.resume可以啟動(dòng)一個(gè)線程或者繼續(xù)一個(gè)掛起的線程。該函數(shù)接收一個(gè)線程對(duì)象以及其他需要傳遞給該線程的參數(shù)。線程可以通過(guò)線程函數(shù)的參數(shù)或者coroutine.yield調(diào)用的返回值來(lái)獲取這些參數(shù)。當(dāng)線程初次執(zhí)行時(shí),resume傳遞的參數(shù)通過(guò)線程函數(shù)的參數(shù)傳遞給線程,線程從線程函數(shù)開(kāi)始執(zhí)行;當(dāng)線程由掛起轉(zhuǎn)為執(zhí)行時(shí),resume傳遞的參數(shù)以yield調(diào)用返回值的形式傳遞給線程,線程從yield調(diào)用后繼續(xù)執(zhí)行

  • 線程放棄調(diào)度

    線程調(diào)用coroutine.yield暫停自己的執(zhí)行,并把執(zhí)行權(quán)返回給啟動(dòng)/繼續(xù)它的線程;線程還可利用yield返回一些值給后者,這些值以resume調(diào)用的返回值的形式返回。 

附錄 常用的Lua參考資料

lua 論壇(lua 中國(guó)開(kāi)發(fā)者 luaer中國(guó)官司方網(wǎng)站)

Lua參考手冊(cè)(最正式、權(quán)威的Lua文檔)

Lua編程(在線版,同樣具權(quán)威性的Lua教科書)

Lua正式網(wǎng)站的文檔頁(yè)面(包含很多有價(jià)值的文檔資料鏈接)

Lua維基(最全面的Lua維基百科)

LuaForge(最豐富的Lua開(kāi)源代碼基地) 

參考文獻(xiàn)《C/C++程序員的Lua快速入門》

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)