dofile讀入文件編譯并執(zhí)行,真正完成功能的函數(shù)是loadfile;與dofile不同,loadfile僅僅是編譯代碼成中間碼,并且把編譯后的chunk作為函數(shù)返回。如果發(fā)生錯誤,返回nil和錯誤信息。我們可以這么定義dofile:
復制代碼 代碼如下:
function dofile(filename)
local f = assert(loadfile(filename))
return f()
end
如果你只調(diào)用一次,可以使用dofile(filename),如果是調(diào)用多次,可以f = loadfile(filename); f();f()...
loadstring與loadfile相似,只不過他是從一個串中讀入。
lua中函數(shù)定義發(fā)生在運行時而不是編譯時。
復制代碼 代碼如下:
f = loadstring("i=i+1")
與f = function() i = i+1 end等價。但loadstring不關(guān)心詞法范圍:
i = 33
local i = 0;
f = loadstring("i=i+1")
g = function() i = i+1 end
g使用的是局部變量i,而f使用的是全局變量i,因為f總是在全局環(huán)境下編譯。
犯錯是人的本性,因此我們必須以最佳的方式來處理錯誤。lua作為擴展語言,經(jīng)常嵌入到其他應用,當錯誤發(fā)生時,不能簡單的crash或exit。
復制代碼 代碼如下:
print "enter a number:"
n = io.read("*number")
if not n then error("invalid input") end
if not condition then error end 的組合太普遍了以至于lua專門內(nèi)建了一個函數(shù)來做這工作,這個函數(shù)就是assert。
通常,當異常發(fā)生時,你有兩個方式處理,要么返回錯誤碼(nil),要么報錯(error)。對于這兩種方式,并沒有固定的準則來做選擇。但是我們提供通用的原則:容易避免的異常應該報錯,否則返回異常。舉例說明:
math.sin接受個number型的弧度值,如果參數(shù)不是number,我們應該報錯,而不是返回錯誤碼。假設(shè)我們是返回錯誤碼,那么我們使用就得這樣:
復制代碼 代碼如下:
local res = math.sin(x)
if not res then
error handling>
其實,我們可以很容易地檢測這個異常,在調(diào)用sin之前:
復制代碼 代碼如下:
if not tonumber(x) then
error handling>
通常,我們是既不檢測sin的參數(shù),也不檢測sin的返回值。如果參數(shù)不是number,往往是我們代碼自身出問題了。這種情況下,停止執(zhí)行并報錯是最簡單也是最實用的方式。
相反的,io.open這個函數(shù),就不存在簡單的在調(diào)用open之前就檢測出異常的方法。打開失敗可能是因為文件不存在,或權(quán)限不夠。通過返回錯誤碼,你可以采用適當?shù)姆绞絹硖幚?,比如讓用戶輸入另一個文件名。