• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            require函數(shù)詳解(轉(zhuǎn))

            Posted on 2010-06-20 12:53 S.l.e!ep.¢% 閱讀(1537) 評論(0)  編輯 收藏 引用 所屬分類: Lua
            簡介
            require函數(shù)像dofile一樣載入文件為一個Chunk并執(zhí)行。但具有兩個好處:1. 按模式加載文件 2.不會重復(fù)載入相同的文件

            require和package.path的關(guān)系


            典型的package.path值如下(其中D:\Bin為lua.exe所在目錄):
            .\?.lua;D:\Bin\lua\?.lua;D:\Bin\lua\?\init.lua;D:\Bin\?.lua;D:\Bin\?\init.lua
            通常對我們有用的目錄是.\?.lua

            例如require("test")將載入.\test.lua

            require和package.loaded的關(guān)系

            如果沒有載入任何Chunk,典型的package.loaded是類似如下的一張表
            string??? table: 00375D48
            package?? table: 00373C30
            _G??????? table: 00371FD8
            os??????? table: 00375628
            table???? table: 00373198
            math????? table: 003763C8
            coroutine table: 003738A8
            debug???? table: 00376FA0
            io??????? table: 00374DC8


            當我們require("main")成功后,該表會變回
            string??? table: 00375D58
            package?? table: 00373C38
            _G??????? table: 00371FC0
            os??????? table: 00375638
            table???? table: 003731A0
            math????? table: 003763D8
            coroutine table: 003738B0
            debug???? table: 00376FB0
            io??????? table: 00374DD8
            main????? true???????????? <== 新增表項
            package.loaded["main"] = true

            require函數(shù)的偽代碼
            # function require(virname) do
            # ?? if not package.loaded[virname] then
            #???? return
            #?? end
            #
            #?? local anyfileloaded = false
            #?? patternpath = (replace '?' in package.path to virname)
            #?? foreach path in patternpath split by ';' do <== virname如果含有'.', 那么'.'會被替換為'\\'
            # ??? if ((chunk = loadfile(path)) ~= nil) then
            # ????? chunk()
            # ????? package.loaded[virname] = true??????????<== 可以手工設(shè)置 package.loaded[virname] = false來重復(fù)載入該文件
            # ????? anyfileloaded = true
            # ????? break
            # ??? end
            #?? end
            #
            # if not anyfileloaded then
            # ??? print error message
            #?? end
            # end

            載入父目錄文件
            值得注意的是當前目錄下的子目錄可以用require("subdir\\subdirfile")的方式載入,而父目錄卻不可以用 require("..\\pardirfile")的方式載入。
            原因是subdir\subdirfile被替換為.\subdir\subdirfile.lua;...
            而..\pardirfile被替換為.\\\\pardirfile.lua;...

            我們可以通過如下方式載入父目錄文件
            package.path = package.path ..
            ";..\\?.lua"
            require(pardirfile)

            注意這里
            package.path = package.path .. ";..\\?.lua"和 package.path = "..\\?.lua;" .. package.path;有些區(qū)別;前者最后匹配 ";..\\?.lua",后者首先匹配 ";..\\?.lua"; 至于那種方式好那就看各位的愛好了
            久久www免费人成看国产片| 久久中文骚妇内射| 狠狠色丁香久久综合婷婷| 亚洲国产综合久久天堂 | 久久久无码精品亚洲日韩蜜臀浪潮| 国产一级持黄大片99久久| 久久99国产综合精品女同| 久久人人爽人人爽人人片av高请| 久久人人爽人人爽人人片AV高清| 久久人人爽人人人人爽AV| 亚洲综合伊人久久综合| 久久久久久九九99精品| 国产国产成人精品久久| 伊人久久免费视频| 久久久久国产一区二区三区| 亚洲欧美国产日韩综合久久| 久久亚洲国产精品成人AV秋霞| 国产成人无码精品久久久性色 | 午夜天堂av天堂久久久| 久久精品a亚洲国产v高清不卡| 91精品国产91久久久久福利 | 91久久精一区二区三区大全| 国产午夜福利精品久久2021 | 久久婷婷色香五月综合激情 | 久久久噜噜噜久久熟女AA片| 欧美久久精品一级c片片| 久久丝袜精品中文字幕| 99精品久久精品一区二区| 韩国无遮挡三级久久| 国产一区二区久久久| 97久久久精品综合88久久| 久久久这里有精品中文字幕| 99久久精品国产一区二区| 老司机国内精品久久久久| 色诱久久av| 久久这里只有精品首页| 亚洲精品tv久久久久| 精品999久久久久久中文字幕| 噜噜噜色噜噜噜久久| 国产一区二区精品久久凹凸| 人妻精品久久无码专区精东影业|