可以說Lua之所以稱為是一種解釋型的語言,正是因為有諸如load這樣的函數(shù),因為這樣的函數(shù)使得Lua可以執(zhí)行動態(tài)生成的代碼。下面具體來分析這些函數(shù)。
load函數(shù)
load函數(shù)原型如下:
復制代碼 代碼如下:
load (chunk [, chunkname [, mode [, env]]])
該函數(shù)加載一個chunk,如果沒有錯誤,則返回一個函數(shù)。如果傳入chunk的值是一個字符串,則就加載這個字符串;如果傳入chunk的值是一個函數(shù),則這個函數(shù)必須返回一個字符串,并且load會一直調用這個函數(shù),直到這個函數(shù)返回空字符串或nil,load會把每次函數(shù)的返回結果連接起來作為chunk去加載。
如果沒有語法錯誤,則load返回chunk對于的函數(shù),否則返回nil和對應的錯誤信息。如果返回的函數(shù)有upvalue,則第一個upvalue的值被設置成傳入的參數(shù)env,若沒有傳入這個參數(shù)的值,則第一個upvalue的值為全局環(huán)境。返回的函數(shù)upvalue不會任何其他函數(shù)共享。
參數(shù)chunkname作為錯誤信息的chunk的名字,用于調試。若chunk是字符串,則chunkname默認值是變量chunk的值,否則是=(load)。參數(shù)mode決定了傳入給chunk的值是文本或二進制數(shù)據(jù)。如果是”b”,則傳給chunk的值必須是二進制數(shù)據(jù)(比如可以使用string.dump(foo)得到相應函數(shù)的二進制數(shù)據(jù),然后傳遞給load),如果是”t”,而必須是文本數(shù)據(jù),如果是”bt”,則文件或二進制數(shù)據(jù)都可以。默認值是”bt”。
Lua不會檢測二進制數(shù)據(jù)的穩(wěn)定性,因此惡意的二進制數(shù)據(jù)可能導致Lua解釋器Crash。
loadfile函數(shù)
函數(shù)原型如下:
復制代碼 代碼如下:
loadfile ([filename [, mode [, env]]])
該函數(shù)類似于load,但是從文件filename或標準輸入(若filename為空)中活動chunk加載。
dofile函數(shù)
函數(shù)原型如下:
復制代碼 代碼如下:
dofile ([filename])
讀取文件filename的內容,并把它作為lua的chunk執(zhí)行。如果沒傳入?yún)?shù),則從標準輸入中讀取執(zhí)行內容。返回值跟chunk執(zhí)行后返回的值相同。如果出現(xiàn)錯誤,dofile會把錯誤信息傳遞給它的調用者。也就是說,dofile在無保護模式下執(zhí)行。注意該函數(shù)不同于loadfile,loadfile只是返回一個函數(shù),并不會執(zhí)行,并且出現(xiàn)錯誤時,loadfile會返回一個錯誤信息,而不會傳遞給它的調用者。總之、loadfile會從一個文件中加載Lua代碼塊,但不會運行代碼,只是編譯代碼,然后將編譯結果從一個函數(shù)返回。而dofile除了編譯代碼外,還會運行返回的結果。
上面討論的Lua層面的編譯執(zhí)行相關的函數(shù),對應的C API相關函數(shù)有:lua_load、luaL_loadfilex、luaL_loadfile和luaL_dofile,這些函數(shù)非常類似對應的Lua層函數(shù)。
loadstring函數(shù)
函數(shù)原型如下:
復制代碼 代碼如下:
loadstring (string [, chunkname])
該函數(shù)通用類似于load,它等價于給load函數(shù)傳遞字符串做作為參數(shù)。為了加載和運行一個字符串,可以這些寫:
復制代碼 代碼如下:
assert(loadstring(s))()
注意該函數(shù)在Lua5.2被刪除了,因為它完全可被load替代。
以上所述就是本文的全部內容了,希望對大家熟練掌握lua能夠有所幫助。
您可能感興趣的文章:- Lua中使用元表(metatable)執(zhí)行算術類元方法實例
- Lua中的源代碼預編譯淺析
- Lua簡介、編譯安裝教程及變量等語法介紹
- Mac平臺中編譯安裝Lua運行環(huán)境及Hello Lua實例