• <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機(jī)制

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

            lua中的require機(jī)制

                為了方便代碼管理,通常會(huì)把lua代碼分成不同的模塊,然后在通過(guò)require函數(shù)把它們加載進(jìn)來(lái)。
            現(xiàn)在看看lua的require的處理流程。

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

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

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

              清楚了lua關(guān)于模塊的處理,就比較容易理解寫lua擴(kuò)展的細(xì)節(jié)了^_^。

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

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久99国产一区二区三区| 亚洲欧洲精品成人久久奇米网| 亚洲中文字幕伊人久久无码| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 精品无码久久久久国产动漫3d| 无码人妻久久久一区二区三区 | 久久久久99精品成人片直播| 99久久精品费精品国产一区二区 | 日本亚洲色大成网站WWW久久| 国产精品久久久久久久app| 久久久久久久久无码精品亚洲日韩 | 国产91色综合久久免费| 久久久久这里只有精品| 久久久久久亚洲AV无码专区| 精品久久国产一区二区三区香蕉 | 四虎国产精品成人免费久久| 国产精品久久网| 国产99久久久国产精品小说| 久久国产精品-久久精品| 成人久久免费网站| 精品多毛少妇人妻AV免费久久| 性做久久久久久久| 色婷婷狠狠久久综合五月| 97久久国产亚洲精品超碰热| 久久无码AV中文出轨人妻| 久久久WWW成人| 狠狠久久亚洲欧美专区| 久久精品国产男包| 日日狠狠久久偷偷色综合免费| 97久久超碰国产精品旧版| 久久中文字幕人妻熟av女| 四虎亚洲国产成人久久精品| 91久久精品视频| 亚洲综合婷婷久久| 国产福利电影一区二区三区久久久久成人精品综合 | 久久精品国产亚洲AV蜜臀色欲 | 亚洲精品无码久久久久久| 久久这里只精品99re66| 老司机午夜网站国内精品久久久久久久久| 久久久久四虎国产精品| 久久免费小视频|