Lua 是一個小巧的腳本語言。它是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所組成的研究小組於1993年開發的。 其設計目的是為了通過靈活嵌入應用程式中從而為應用程式提供靈活的擴展和定製功能。Lua由標準C編寫而成,幾乎在所有作業系統和平台上都可以編譯,運行。Lua並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作為開發獨立應用程式的語言。Lua 有一個同時進行的JIT項目,提供在特定平台上的即時編譯功能。
Lua腳本可以很容易的被C/C++ 代碼調用,也可以反過來調用C/C++的函式,這使得Lua在應用程式中可以被廣泛套用。不僅僅作為擴展腳本,也可以作為普通的配置檔案,代替XML,ini等檔案格式,並且更容易理解和維護。Lua由標準C編寫而成,代碼簡潔優美,幾乎在所有作業系統和平台上都可以編譯,運行。一個完整的Lua解釋器不過200k,在目前所有腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是作為嵌入式腳本的最佳選擇。
基本介紹
- 外文名:lua
- 類型:腳本語言
- 研究地點:巴西里約熱內盧天主教大學
- 研究時間:1993年
保存和運行
目標
特性
輕量級
可擴展
其它特性
套用場景
- 遊戲開發
- 獨立套用腳本
- Web 套用腳本
- 擴展和資料庫外掛程式如:MySQL Proxy 和 MySQL WorkBench
- 安全系統,如入侵檢測系統
示例代碼
print"Hello,world!"
function create_a_counter() local count=0 return function() count = count + 1 return count endend
print(create_a_counter())
ct = create_a_counter()print(ct()) --輸出> 1print(ct()) --輸出> 2
數據交換
void lua_getglobal(lua_State *L, const char *name)
lua_tonumber返回的是doublelua_tostring返回的是char*
lua_pushstring(L, "i");
while(lua_next(L, -2)!=0){ if(lua_isnumber(L, -1))//判斷元素類型,也可能是string { arrf.add((float)lua_tonumber(L, -1));//獲取元素的值 lua_remove(L, -1); }}lua_remove(L,-1);//刪除NIL
x,y = Test()
lua_newtable(L); //創建一個表格,放在棧頂lua_pushstring(L,"mydata"); //壓入keylua_pushnumber(L,66); //壓入valuelua_settable(L,-3); //彈出key,value,並設定到table裡面去lua_pushstring(L,"subdata");//壓入keylua_newtable(L); //壓入value,也是一個tablelua_pushstring(L,"mydata"); //壓入subtable的keylua_pushnumber(L,53);valuelua_settable(L,-3); //彈出key,value,並設定到subtablelua_settable(L,-3); //這時候父table的位置還是-3,彈出key,value(subtable), //並設定到table里去lua_pushstring(L,"mydata2");//同上lua_pushnumber(L,77);lua_settable(L,-3);return1;//棧里現在就一個table其他都被彈掉了。如果要返回一個數組,//用如下代碼:(注意那個關於trick的注釋,我在等官方的解釋。//經過驗證,這個問題只在windows版本調用dll中方法的時候出現。WinCE正常)lua_pushstring(L,"arri");lua_newtable(L);{ //atrick:otherwisetheluaenginewillcrash.ThiselementisinvisibleinLuascript lua_pushnumber(L,-1); lua_rawseti(L,-2,0); for(int i=0; i<arri.size(); i++) { lua_pushnumber(L, arri); lua_rawseti(L, -2, i+1); }}lua_settable(L,-3);
for i,v in ipairs(data.arri)do print(v)end
for i=1,table.getn(data.arri)do print(data.arri)end
typedef enum{BR_9600,BR_4800,}BaudRate;typedef struct flag{ int onoff; int j; long l; double d; char *name; BaudRate rate;}flag;
可以自動產生如下代碼:
bool DataToLua(flagdata, lua_State*L){ lua_newtable(L); lua_pushstring(L, "onoff"); lua_pushnumber(L, double)data.onoff); lua_settable(L, -3); lua_pushstring(L, "j"); lua_pushnumber(L, (double)data.j); lua_settable(L, -3); lua_pushstring(L, "l"); lua_pushnumber(L, (double)data.l); lua_settable(L, -3); lua_pushstring(L, "d"); lua_pushnumber(L, double)data.d); lua_settable(L, -3); lua_pushstring(L, "name"); lua_pushstring(L, data.name.c_str()); lua_settable(L, -3); lua_pushstring(L, "rate"); lua_pushnumber(L, (double)(int)data.rate); lua_settable(L, -3); return true;}