解析調用Lua函數使用方法

來源:互聯網
上載者:User

調用Lua函數使用方法是本文要介紹的內容,本教程涵蓋了Lua5.1。在Lua的每一個版本中都有一些非常不同之處。下面的範例程式碼將不能在老版本的Lua下運行。這篇文章將教你如何在Lua中定義一個函數,然後在C/C++程式中調用它。同時,我們將學習到參數傳遞,傳回值,以及處理全域變數。

你的第一個Lua函數

Lua中定義函數是相當簡單的。Lua函數以關鍵字"function"開頭,後面跟隨函數名,然後是參數列表。函數定義以關鍵字"end"結束。Lua函數能夠接受多個參數,而且可以返回多個參數。

下面是一個實現兩個數相加並返回結果的Lua函數。我們將它儲存為"add.lua"檔案。

 
  1. -- 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"刪除。

 
  1. #include <stdio.h>  extern "C" {   
  2. #include "lua.h"   
  3. #include "lualib.h"   
  4. #include "lauxlib.h"  
  5. }    
  6. /* 指向Lua解譯器的指標 */  
  7. lua_State* L;   
  8. int luaadd (   
  9. int x, int y   
  10. ){  
  11.  int sum;  
  12.   /* 通過名字得到Lua函數 */  
  13.  lua_getglobal(L, "add");   
  14.  /* 第一個參數 */  
  15.  lua_pushnumber(L, x);   
  16.  /* 第二個參數 */  
  17.  lua_pushnumber(L, y);   
  18.  /* 調用函數,告知有兩個參數,一個傳回值 */  
  19.  lua_call(L, 2, 1);   
  20.  /* 得到結果 */  
  21.  sum = (int)lua_tointeger(L, -1);  
  22.  lua_pop(L, 1);   
  23.  return sum;  
  24.  }    
  25.  int main ( int argc, char *argv[] ){   
  26.  int sum;   
  27.  /* 初始化Lua */  
  28.  L = lua_open();   
  29.  /* 載入Lua基本庫 */  
  30.  luaL_openlibs(L);   
  31.  /* 載入指令碼 */  
  32.  luaL_dofile(L, "add.lua");   
  33.  /* 調用Lua函數 */  
  34.  sum = luaadd( 10, 15 );   
  35.  /* 顯示結果 */  
  36.  printf( "The sum is %d/n", sum );   
  37.  /* 清除Lua */  
  38.  lua_close(L);   
  39.  /* 暫停 */  
  40.  printf( "Press enter to exit…" );  
  41.  getchar();   
  42.  return 0;  
  43.  }  

編譯

在Linux下,在命令列鍵入:

 
  1. g++ luaadd.cpp -llua -ldl -o luaadd  

然後,鍵入下列命令運行:

 
  1. ./luaadd 

如果沒有問題, 程式將顯示結果為: "The sum is 25"。

在Visual C++你將需要進行下列步驟:

建立一個新的空Win32控制台應用工程。

將"luatest.cpp"加入你的工程。

選擇項目菜單中的屬性菜單。

在"連接器"的"輸入"欄目的"附加依賴項"中輸入"lua5.1.lib"。

確定。

此時,按F7構建程式。

如果你採用的是dll庫,請確保將其放在應用程式的目錄中或者windows系統能夠找到它的地方。如果你採用的是靜態串連庫,則不需要。 

全域變數

全域變數在Lua中也很好處理。就像我們看到的,lua_getglobal()將一個Lua全域變數壓入棧中。例如,在Lua指令碼中包含一個全域變數z,下面代碼的功能就是得到它的值:

 
  1. lua_getglobal(L, "z");z = (int)lua_tointeger(L, -1);lua_pop(L, 1);  

相應地,lua_setglobal()函數能夠設定全域變數地值。下面這段代碼示範了如何將Lua全域變數z的值變為10:

 
  1. lua_pushnumber(L, 10);lua_setglobal(L, "z");  

應該記住:在Lua中,我們沒有必要顯式定義一個全域變數。如果全域變數不存在,調用lua_setglobal()將為你建立一個。

小結:解析調用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.