【寫在前面:本文主要講解這幾個容易混淆和忘記的概念之間的區別,並未做深入討論,歡迎大家提寶貴意見!】
重點掌握 require,dofile,loadfile,其他的了解即可。
一、require
1.功能:載入文件並執行代碼塊,對於相同的文件只執行一次
2.調用:require(“filename”)
注:尋找文件的路徑在package.path中,print(package.path)即可得到。
二、dofile
1.功能:載入文件並執行代碼塊,對於相同的文件每次都會執行
2.調用:dofile("filename")
3.錯誤處理:如果代碼塊中有錯誤則會引發錯誤
4.優點:對簡單任務而言,非常便捷
5.缺點:每次載入文件時都會執行程序塊
6.定位:內置操作,輔助函數
三、loadfile
1.功能:載入文件但不執行代碼塊,對於相同的文件每次都會執行。只是編譯代碼,然后將編譯結果作為一個函數返回
2.調用:loadfile("filename")
3.錯誤處理:不引發錯誤,只返回錯誤值但不處理錯誤,即返回nil和錯誤消息
4.優點:調用一次之后可以多次調用返回的結果(即函數),即“多次調用”只需編譯一次(注:這里的多次調用是指多次調用返回的函數,而不是多次調用loadfile)
dofile可如下定義:
function dofile(filename)
local f = assert(loadfile(filename)) --調用loadfile(的返回結果)並可處理錯誤
return f()
end
注:加載了程序塊並沒有定義其中的函數。在Lua中,函數定義是一種賦值操作,是在運行時才完成的操作。
例如:一個文件test.lua中有一個函數 function foo(x) print(x) end ,執行如下代碼:
f = loadfile(test.lua) --加載程序塊,此時還沒有定義函數foo
f() --運行加載的程序塊,此時就定義了函數foo
foo("hello lua") -->hello lua --經過上面的步驟才能調用foo
四、loadstring
與loadfile類似,不同的是loadstring是從一個字符串中讀取代碼,而非從文件中讀取,即loadfile的參數是一個文件名,而loadstring的參數是一個字符串,同樣返回的是一個函數。
1.特點:功能強大,但開銷大;
2.典型用處:執行外部代碼,如:用戶的輸入
3.錯誤錯里:代碼中如果有語法錯誤就會返回nil
4.理解:f = loadstring("i = i+1") 可理解為(但不完全是)f = function() i = i+1 end (注:這里的變量"i"是全局變量,不是指局部變量,如果沒有定義全局變量"i",調用f()則會報錯!,即loadstring不涉及詞法域)
例如:
i = 32
local i = 1
f = loadstring("i = i+1;print(i)")
g = function() i = i+1;print(i) end
f() -->33 --不涉及詞法域
g() -->2 --涉及詞法域
五、dostring
類似dofile:加載並運行
六、loadlib(package.loadlib)
提供所有Lua中關於動態連接的功能,是一個非常底層的函數
1.功能:加載指定的庫,並將其鏈接入Lua,不會調用庫中的任何函數
2.調用:f = package.loadlib(path,"functionname"):path動態庫的完整路徑,functionname函數名
3.錯誤處理:返回nil及錯誤消息
七、load
一般很少使用load
理解: load是loadfile 和 loadstring的原始函數,接受一個“讀取器函數”,並在內部調用它讀取程序塊,讀取器函數可分幾次返回一個程序塊,load會反復調用它直到返回nil為止。
load不會引發錯誤,但程序塊中有錯誤的時候會返回nil及錯誤消息
應用: 當程序塊不在文件中,或程序塊過大而無法載入到內存時才使用load