調用Lua函數使用方法是本文要介紹的內容,本教程涵蓋了Lua5.1。在Lua的每一個版本中都有一些非常不同之處。下面的範例程式碼將不能在老版本的Lua下運行。這篇文章將教你如何在Lua中定義一個函數,然後在C/C++程式中調用它。同時,我們將學習到參數傳遞,傳回值,以及處理全域變數。
你的第一個Lua函數
在Lua中定義函數是相當簡單的。Lua函數以關鍵字"function"開頭,後面跟隨函數名,然後是參數列表。函數定義以關鍵字"end"結束。Lua函數能夠接受多個參數,而且可以返回多個參數。
下面是一個實現兩個數相加並返回結果的Lua函數。我們將它儲存為"add.lua"檔案。
- -- add two numbersfunction add ( x, y )return x + yend
在Lua入門中,我們已經知道調用luaL_dofile()就是執行指令碼。因為在本文中我們只定義了一個函數,故只需簡單地調用luaL_dofile()函數就能執行add函數。
我在前面已經說過,Lua函數能夠接受多個參數,返回多個結果。這是用棧來實現的。
為了調用一個Lua函數,首先需要將函數壓入棧中。再將參數壓入。然後,調用lua_call()去調用Lua函數。函數調用完成之後,傳回值存在於棧中。所有這些步驟將被展示在luaadd()函數定義中。
調用lua_getglobal()將add()函數壓入棧中。
調用lua_pushnumber()將第一個參數x壓入棧中。
同樣,調用lua_pushnumber()將第二個參數y壓入棧中。
調用lua_call(),其參數的意思是兩個參數,一個傳回值。
現在,我們可以利用lua_tointeger()獲得整型傳回值。
最後,調用lua_pop()將值從棧中移出。
儲存檔案為luaadd.cpp。如果你直接使用C而不是C++,將檔案名稱改為luaadd.c,然後將extern "C"刪除。
- #include <stdio.h> extern "C" {
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- }
- /* 指向Lua解譯器的指標 */
- lua_State* L;
- int luaadd (
- int x, int y
- ){
- int sum;
- /* 通過名字得到Lua函數 */
- lua_getglobal(L, "add");
- /* 第一個參數 */
- lua_pushnumber(L, x);
- /* 第二個參數 */
- lua_pushnumber(L, y);
- /* 調用函數,告知有兩個參數,一個傳回值 */
- lua_call(L, 2, 1);
- /* 得到結果 */
- sum = (int)lua_tointeger(L, -1);
- lua_pop(L, 1);
- return sum;
- }
- int main ( int argc, char *argv[] ){
- int sum;
- /* 初始化Lua */
- L = lua_open();
- /* 載入Lua基本庫 */
- luaL_openlibs(L);
- /* 載入指令碼 */
- luaL_dofile(L, "add.lua");
- /* 調用Lua函數 */
- sum = luaadd( 10, 15 );
- /* 顯示結果 */
- printf( "The sum is %d/n", sum );
- /* 清除Lua */
- lua_close(L);
- /* 暫停 */
- printf( "Press enter to exit…" );
- getchar();
- return 0;
- }
編譯
在Linux下,在命令列鍵入:
- g++ luaadd.cpp -llua -ldl -o luaadd
然後,鍵入下列命令運行:
- ./luaadd
如果沒有問題, 程式將顯示結果為: "The sum is 25"。
在Visual C++你將需要進行下列步驟:
建立一個新的空Win32控制台應用工程。
將"luatest.cpp"加入你的工程。
選擇項目菜單中的屬性菜單。
在"連接器"的"輸入"欄目的"附加依賴項"中輸入"lua5.1.lib"。
確定。
此時,按F7構建程式。
如果你採用的是dll庫,請確保將其放在應用程式的目錄中或者windows系統能夠找到它的地方。如果你採用的是靜態串連庫,則不需要。
全域變數
全域變數在Lua中也很好處理。就像我們看到的,lua_getglobal()將一個Lua全域變數壓入棧中。例如,在Lua指令碼中包含一個全域變數z,下面代碼的功能就是得到它的值:
- lua_getglobal(L, "z");z = (int)lua_tointeger(L, -1);lua_pop(L, 1);
相應地,lua_setglobal()函數能夠設定全域變數地值。下面這段代碼示範了如何將Lua全域變數z的值變為10:
- lua_pushnumber(L, 10);lua_setglobal(L, "z");
應該記住:在Lua中,我們沒有必要顯式定義一個全域變數。如果全域變數不存在,調用lua_setglobal()將為你建立一個。
小結:解析調用Lua函數使用方法的內容介紹完了,希望通過本文的學習能對你有所協助!