Lua初學者文檔:關於Lua語言簡單介紹

來源:互聯網
上載者:User

Lua 是一個小巧的指令碼語言,該語言的設計目的是為了嵌入應用程式中,從而為應用程式提供靈活的擴充和定製功能。Lua最著名的應用是在暴雪公司的網路遊戲WOW中。

Lua指令碼可以很容易的被C/C++代碼調用,也可以反過來調用C/C++的函數,這使得Lua在應用程式中可以被廣泛應用。不僅僅作為擴充指令碼,也可以作為普通的設定檔,代替XML,Ini等檔案格式,並且更容易理解和維護。

Lua由標準C編寫而成,代碼簡潔優美,幾乎在所有作業系統和平台上都可以編譯,運行。一個完整的Lua解譯器不過200k,在目前所有指令碼引擎中,Lua的速度是最快的。這一切 都決定了Lua是作為嵌入式指令碼的最佳選擇。

Lua 有一個同時進行的JIT項目,提供在特定平台上的即時編譯功能,這將給Lua帶來更加優秀的效能。請訪問 http://luajit.luaforge.net/ 來瞭解這個項目。

和Python等指令碼不同,Lua並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作為開發獨立應用程式的語言。不過Lua還是具備了比如數學運算和字串處理等基本的功能。

Lua 目前的最新版本是 5.1.

Lua只有一種資料類型,table. 實際上就是hash表。它用這個來類比數組,鏈表等等。 在文法上,Lua支援如下形式:


這使得Lua具有了跟C的struct類似的形式,非常便於設計C函數的參數,用一個table就可以傳入很複雜的參數。

2、資料交換介紹

Lua和C程式通過一個堆棧交換資料: struct lua_State

堆棧的序號可以從棧頂和棧底計數,從棧底計數,則棧底是1,向棧頂方向遞增。從棧頂計數,則棧頂是-1,向棧底方向遞減。一般都用從棧頂計數的方式。堆棧的預設大小是20,可以用lua_checkstack修改.用lua_gettop則可以獲得棧裡的元素數目。並不是說在棧頂有一個整形元素。而是計算了一下棧頂元素在棧裡的正index,相當於元素數目。

Lua 調用C函數用的堆棧是臨時的,調用結束之後就被銷毀了。

如何從堆棧中擷取從Lua指令碼中的參數

如果知道Lua指令碼中某個全域變數的名字,可以用void lua_getglobal (lua_State *L, const char *name) 。這個函數會將name所指Lua變數的值放在棧頂.

如果是在C 函數中要擷取Lua調用函數使用的參數:

首先用lua_gettop檢查參數數量

用lua_is...類函數檢測參數的類型,做好錯誤處理

用lua_to...類函數將參數轉換為number或者string.(對Lua來說,只有這兩種簡單類型)

lua_tonumber返回的是double

lua_tostring返回的是char*

用lua_remove從棧中刪除掉元素

繼續擷取下一個元素. 因為每次都調用lua_remove,所以每次調用lua_tonumber,使用的index都將固定是-1,即棧頂。

如果lua_istable成立,那麼說明棧頂是一個table.注意table是不能取出來的,只能把table裡的元素一個個取出來。

首先把元素的名字壓入棧頂: lua_pushstring(L,"i"); 然後就可以用lua_gettable調用,值會放在棧頂。同時剛才壓入的元素名字被彈出。 用上面的辦法,可以把這個值取出來。記得也應該lua_remove。 如果table的某一個元素也是table,重複即可。 當table的所有元素都取完了,記住這個table本身還在堆棧裡,要用lua_remove把它刪除。

如果要擷取的是一個數組(所謂數組,其實就是key是從1開始的數字序列的table,並且實值型別相同),用lua_next可以遍曆這個數組:

首先lua_pushnil,壓入一個空值,然後


如何從C返回資料給Lua指令碼

用lua_push...類函數壓入資料到堆棧中,並用return n;來告訴Lua返回了幾個傳回值。 Lua是天生支援多個傳回值的,如 x,y = Test()。 Lua會根據n從棧裡取相應的資料。

如果要返回一個table:


如果要返回一個數組,用如下代碼:(注意那個關於trick的注釋,我在等官方的解釋。經過驗證,這個問題只在windows版本調用dll中方法的時候出現。WinCE正常)


這樣產生的數組可以在Lua中如下遍曆:


或者是


只有數組才能這樣,name,value構成的Record不行,table.getn也只對數組有效。

由於上述代碼的高度相似性,所以很容易實現自動產生這些代碼。比如,根據C的一個struct定義:


可以自動產生如下代碼:


LuaToData也是類似的。

如果使用物件導向的方式封裝起flag來,把DataToLua變成flag類的一個方法,就更加方便了。

3、C和Lua指令碼互相調用舉例

首先是C的主程式初始化Lua指令碼引擎,並註冊一些函數供指令碼中調用:


指令碼的代碼如下:


小結:Lua初學者文檔:關於Lua語言簡單介紹的內容介紹完了,希望通過本文的學習能對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.