• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            lua中的require機制

            http://blog.chinaunix.net/uid-552961-id-2736410.html

            lua中的require機制

                為了方便代碼管理,通常會把lua代碼分成不同的模塊,然后在通過require函數把它們加載進來。
            現在看看lua的require的處理流程。

            1、require機制相關的數據和函數
                package.path:保存加載外部模塊(lua中"模塊"和"文件"這兩個概念的分界比較含糊,因為這個值在不同的時刻會扮演不同的角色)的搜索 路徑,這種路徑是"模板式的路徑",它里面會包含可替代符號"?",這個符號會被替換,然后lua查找這個文件是否存在,如果存在就會調用其中特定的接 口。典型的值為:
                "./?.lua;./?.lc;/usr/local/?/init.lua"
                如果lua代碼中調用:require("hello.world")
                那么lua會依次查找:
                ./hello/world.lua ==>這里"hello.world"變成了"hello/world",并替換了模型"./?.lua"
                ./hello/world.lc
                .....
                (這種處理方式和python類似,只不過不需要__init__.py,也有調用python中的__init__.py)
                package.path在虛擬機啟動的時候設置,如果存在環境變量LUA_PATH,那么就用該環境變量作為
                它的值,并把這個環境變量中的";;"替換為luaconf.h中定義的默認值,如果不存在該變量就直接使用
                luaconf.h定義的默認值
                
                package.cpath:作用和packag.path一樣,但它是用于加載第三方c庫的。它的初始值可以通過環境變量
                LUA_CPATH來設置
                
                package.loadlib(libname, func):相當與手工打開c庫libname, 并導出函數func返回,loadlib其實是ll_loadlib
                

            2.require的處理流程:
               require(modelname)
               require(在lua中它是ll_require函數)的查找順序如下:
                   a.首先在package.loaded查找modelname,如果該模塊已經存在,就直接返回它的值
                   b.在package.preload查找modelname, 如果preload存在,那么就把它作為loader,調用loader(L)
                   c.根據package.path的模式查找lua庫modelname,這個庫是通過module函數定義的,對于頂層的lua庫,文件名和庫名是一 樣的而且不需要調用顯式地在lua文件中調用module函數(在ll_require函數中可以看到處理方式),也就是說lua會根據lua文件直接完 成一個loader的初始化過程。
                   d.根據package.cpath查找c庫,這個庫是符合lua的一些規范的(export具有一定特征的函數接口),lua先已動態的方式加載該c庫,然后在庫中查找并調用相應名字的接口,例如:luaopen_hello_world
                   e.已第一個"."為分割,將模塊名劃分為:(main, sub)的形式,根據package.cpath查找main,如果存在,就加載該庫并查詢相應的接口:luaopen_main_sub,例如:先查找 hello庫,并查詢luaopen_hello_world接口
                   f.得到loder后,用modname作為唯一的參數調用該loader函數。當然參數是通過lua的棧傳遞的,所以loader的原型必須符合lua的規范:int LUA_FUNC(lua_State *L)
                     
                   ll_require會將這個loader的返回值符給package.loaded[modelname],如果loader不返回值同時 package.loaded[modelname]不存在時, ll_require就會把package.loaded[modelname]設為true。最后ll_reuqire把package.loaded [modelname]返回給調用者。
                

            3.module的處理流程
                module(name, cb1, cb2, ...)
                
                a.如果package.loaded[name]是一個table,那么就把這個table作為一個mod
                b.如果全局變量name是一個table,就把這個全局變量作為一個mod
                c.創建table:t = {[name]=package.loaded[name], ["_NAME"]=name, ["_M"]=t, ["_PACKAGE"]=*name*(刪除了最后的".XXXX"部分)}. 如果name是一個以點分割的串,那么得到的mod類似這個樣子:
                  hello.world==> {["hello"]={["world"]={XXXXXXX}}}
                d.依次調用cbs:
                  cb1(mod), cb2(mod),...
                  
                e.將當前模塊的環境設置為mod,同時把package.loaded[name] = mod    
                

              清楚了lua關于模塊的處理,就比較容易理解寫lua擴展的細節了^_^。

            posted on 2014-08-21 17:08 多彩人生 閱讀(344) 評論(0)  編輯 收藏 引用 所屬分類: lua

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产福利电影一区二区三区久久久久成人精品综合 | 青青热久久国产久精品 | 久久se精品一区二区影院| 亚洲国产成人久久综合野外| 99精品国产综合久久久久五月天| 精品精品国产自在久久高清| 久久久久亚洲AV无码专区网站| 午夜天堂av天堂久久久| 久久精品国产精品亚洲| 国内精品伊人久久久久AV影院| 日韩va亚洲va欧美va久久| 国产精品视频久久久| 久久精品综合网| 国产成人久久精品麻豆一区| 精品人妻伦九区久久AAA片69| 国产精品日韩欧美久久综合| 亚洲日本va中文字幕久久| 美女久久久久久| 麻豆精品久久精品色综合| 亚洲AV无码久久精品色欲| 亚洲午夜久久久| 久久精品成人免费国产片小草| 国产精品久久久久AV福利动漫| 国产亚洲精品久久久久秋霞| 久久影院午夜理论片无码 | 国内精品免费久久影院| 九九久久自然熟的香蕉图片| 思思久久精品在热线热| 午夜精品久久久久久| 国产精品熟女福利久久AV| 91久久九九无码成人网站| 国产精品岛国久久久久| 国产成人无码久久久精品一| 色妞色综合久久夜夜| 亚洲AV无码成人网站久久精品大| 久久久SS麻豆欧美国产日韩| 亚洲精品国产第一综合99久久| 武侠古典久久婷婷狼人伊人| 午夜视频久久久久一区 | 日韩电影久久久被窝网| 欧美与黑人午夜性猛交久久久|