Lua中的loadfile、dofile、require詳解

1.loadfile——只編譯,不運行java

loadfile故名思議,它只會加載文件,編譯代碼,不會運行文件裏的代碼。
好比,咱們有一個hellofile.lua文件:函數

複製代碼代碼以下:

print(「hello」);
function hehe()
print(「hello」);
end


這個文件裏有一句代碼,和一個函數。試試用loadfile加載這個文件,以下代碼:測試

複製代碼代碼以下:

    loadfile("hellofile.lua");
    print("end");

 

輸出結果以下:ui

複製代碼代碼以下:

[LUA-print] end


若是說loadfile會執行文件裏的代碼的話,那麼,應該會輸出hello字符串的。
結果代表,它是不會執行代碼的。lua

 

2.dofile——執行spa

很明顯,dofile就是會執行代碼的傢伙了,以下代碼:code

複製代碼代碼以下:

    dofile("E:/Android/wordspace_cocosIDERc0/CocosLuaTest/src/hellofile.lua");
    print("end");

 

輸出結果以下:字符串

複製代碼代碼以下:

[LUA-print] hello
[LUA-print] end


這裏有點尷尬,文件路徑我用了絕對路徑,由於dofile在Coco Code IDE裏使用相對路徑會找不到文件(即便使用了addSearchPath)it

 

不過不要緊,不影響本文的內容。io

3.require——我只執行一次

require和dofile有點像,不過又很不同,require在第一次加載文件的時候,會執行裏面的代碼。

可是,第二次以後,再次加載文件,則不會重複執行了。換句話說,它會保存已經加載過的文件,不會重複加載。
測試代碼以下:

複製代碼代碼以下:

    for i = 1, 2, 1 do
        require("hellofile.lua");
    end
    print("end");

 

爲了說明這種狀況,我刻意調用了兩次require,輸出結果以下:

複製代碼代碼以下:

[LUA-print] hello
[LUA-print] end


和咱們說的同樣,調用了兩次,可是代碼只執行了一次。
若是這裏換成dofile,則會輸出兩次hello字符串。

require:
在lua中,require函數像dofile同樣載入文件爲一個Chunk並執行。但具備兩個好處:1. 按模式加載文件 2.不會重複載入相同的文件。
require的參數是一個完整的文件名(目錄名+文件名,可能有點相似於java中的包吧),即package.path,典型的package.path值以下(其中D:\Bin爲lua.exe所在目錄):
.\?.lua;D:\Bin\lua\?.lua;D:\Bin\lua\?\init.lua;D:\Bin\?.lua;D:\Bin\?\init.lua
一般對咱們有用的目錄是.\?.lua
因此,若是要執行當前目錄的test.lua文件,咱們只須要require("test")便可,可是若是咱們要執行另外一個目錄下的文件,好比"D:\lua\a.lua",咱們就須要將這個路徑加入到package.path當中,例如咱們能夠這樣寫:
package.path=package.path .. ";D:\?.lua"
這樣咱們就可使用require函數了,好比require("a").
注:require只會被加載一次。

 

複製代碼代碼以下:
 for callCount = 0, 2 do   require("test");  end
相關文章
相關標籤/搜索