Lua實現PHP的include函式

2021-09-26 01:35:28 字數 1393 閱讀 9954

最近在參與乙個基於c++/lua的專案, 用lua實現單元測試時需要在測試**內對單元測試庫檔案進行載入, 目的是希望做到在任何測試檔案內都可以執行測試, 而不是必須在特定的入口執行.  但是使用lua內建require函式載入會失敗, 因為其是lua實現module功能的乙個函式所以會有一些和模組相關的特性, 在定製檔案載入目錄時會受到一些侷限(比如想載入上層目錄的模組時),  後來在看lunit**時找到了乙個實現思路:

local

function loadtestcase(filename)

ifnot is_string(filename) then

return

error("

lunit.main: invalid argument

")end

local chunk, err = loadfile(filename)

if err then

return

error(err)

else

chunk()

endend

關鍵就是loadfile函式, 通過手冊了解, 原來此函式會載入乙個lua檔案然後將其儲存為chunk(語句組), 以下是手冊對語句組的介紹.

lua 的乙個執行單元被稱作 chunk。 乙個 chunk 就是一串語句段,它們會被循序的執行。 每個語句段可以以乙個分號結束:

chunk ::=
這兒不允許有空的語句段,所以 ';;' 是非法的。

lua 把乙個 chunk 當作乙個擁有不定引數的匿名函式 (參見 §2.5.9)處理。 正是這樣,chunk 內可以定義區域性變數,接收引數,並且返回值。

chunk 可以被儲存在乙個檔案中,也可以儲存在宿主程式的乙個字串中。 當乙個 chunk 被執行,首先它會被預編譯成虛擬機器中的指令序列, 然後被虛擬機器解釋執行這些指令。

chunk 也可以被預編譯成二進位制形式;細節參考程式luac。 用原始碼形式提供的程式和被編譯過的二進位制形式的程式是可以相互替換的; lua 會自動識別檔案型別並做正確的處理。

所以loadfile載入回來的語句組其實就是是個匿名函式, 我們只需執行此語句組則目標檔案就會載入成功, 就像php的include函式一樣, 化簡的使用辦法:

loadfile( filename )()

現在可以試試載入你需要的檔案了.

loadfile( "

../foo_one.lua

" )()

loadfile( "

bar/foo_two.lua

" )()

loadfile( "

lua_three.lua

" )()

lua實現php的print r 函式功能

example usage require print r a list pr a,my table my table label this is freeware function pr t,name,indent local tablelist function table r t,name,i...

Lua類的實現

cocos2dx中有關於lua類的實現,見cocos原始碼 framework functions。先講一部分比較難理解的 function class classname,super local cls inherited from lua object if super then cls set...

lua實現繼承

lua本身沒有像c 一樣的繼承功能 但是我們可以自己實現乙個類似c 的繼承功能 書本也有詳細介紹,不過讀起來確實費解,所以本人自己寫了乙個簡單的繼承,一目了然,用來學習很容易入手 完整 基類 people function people new o o o or setmetatable o,sel...