cocos2dx-3.4 lua import

cocos2dx版本號:3.4final

lua版本:5.2


從2.x切換到3.4,有幾個不適應的地方,一個就是lua層進行的封。稍微研究了一下,發現2個方法是經常使用,而且是很有意思的,class() and import()。

class主要作用是進行繼承,import毫無以爲就是加載。

lua本身的模塊加載是通過require來實現的。import其實只是對file_name進行了修改,最終依然是使用require進行修改。上代碼先


function import(moduleName, currentModuleName)
    local currentModuleNameParts
    local moduleFullName = moduleName
    local offset = 1

    while true do
        if string.byte(moduleName, offset) ~= 46 then -- .
            moduleFullName = string.sub(moduleName, offset)
            if currentModuleNameParts and #currentModuleNameParts > 0 then
                moduleFullName = table.concat(currentModuleNameParts, ".") .. "." .. moduleFullName
            end
            break
        end
        offset = offset + 1

        if not currentModuleNameParts then
            if not currentModuleName then
                local n,v = debug.getlocal(3, 1)
                currentModuleName = v
            end

            currentModuleNameParts = string.split(currentModuleName, ".")
        end
        table.remove(currentModuleNameParts, #currentModuleNameParts)
    end

    return require(moduleFullName)
end

import(".abc") -- require(app.models.abc)

import("..abc") -- require(app.abc)

import("...abc") -- reuqire(abc)

import("....abc") -- requier(abc)

ps:import所在目錄是 src/app/models/test.lua

結論:.代表上層目錄

ok我們在看一下import是如何獲取外面調用處所在的目錄?

在這裏: 

local n,v = debug.getlocal(3, 1)
print(n,v)打印結果 : (*temporary)  app.models.test

在說說debug吧,lua本身不提供調試器,但是提供了編寫調試器所需的原語句。調試庫有一個重要的概念 “棧層 (stake level)”,一個棧層表示一個數字,即一個已被調用尚未返回的函數。調用調試庫函數的層級是1,調用該函數的函數層級是2,以此類推。

debug.getlocal檢查任意活動函數的局部變量。變量1是函數層級即棧層,2是變量索引。變量索引爲一個數字,根據變量出現的先後順序由1開始遞增。

我們就集齊了7顆龍珠,可以召喚神龍了。不過還是要屢一下。

lua模塊加載通過require加載,import 本身棧層1 -》上層import調用處2 -》在上層,一定是require,棧層3 -》在在上層,可能是import...

所以取棧層爲3,所以爲1的參數,自然取到了調用import的模塊所在的文件位置。

好設計,精緻啊。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章