Lua學習筆記1

2021-06-06 16:39:17 字數 1746 閱讀 6331

今天上班的時候和程式對乙個功能的程式介面,需求是這樣的:指令碼**根據配置檔案生成一組中獎資訊,用table來儲存,然後將這個table傳給程式介面,程式根據這個table中的資料向玩家顯示中獎介面。很簡單的乙個功能,指令碼這邊的函式很快就寫完了,然後我就琢磨著程式的介面應該怎麼寫,由於之前沒有試過在程式介面中訪問lua指令碼傳過來的table,所以遇到了一些麻煩,上網搜了一下相關資料,總算搞清楚了。現在就簡單總結一下c/c++與lua互動中關於table的一些用法吧。

有個lua指令碼函式叫openawardwindow,它是c++實現的乙個介面,對應的c++函式為luaopenawardwindow,它的輸入引數是乙個table。現在我們要解決的問題是怎麼在luaopenawardwindow中遍歷table中的所有元素。我們知道lua是通過棧來實現和c語言的互動的,至於為什麼是棧呢,以後再專門說明吧。指令碼傳過來的table是放在棧頂的,即棧的-1位置,我們可以用lua_istable(l, -1)來檢查輸入引數是否合法。lua的資料型別和c的資料型別是不一樣的,它們必須用專門的函式的轉換,比如lua_tonumber(l, -1)就是把棧頂的資料轉為double型別,lua_tostring(l, -1)是轉為帶結束符的字串型別。新手一定會說,那lua_totable(l, -1)就是轉換了table型別咯^_^。如果c有table這種資料型別,那一定會有這個函式的,可惜c沒有。不過在這裡我有個想法,能不能用c實現一種型別,它是可以和lua的table對應的呢?這樣就真的可以有lua_totable這個介面了,這樣c訪問table就方便多了。我們還是回到如何在c中遍歷table的問題中吧。在c中,它是這樣訪問table中的乙個元素的:

//將乙個key放到棧頂,這個key為1。如果你的key是字串,那就用lua_pushstring。

lua_pushnumber(l, 1);

//table一開始是在棧頂,即-1處的,但上面的語句壓入了乙個值,棧頂變-2了。

//lua_gettable的作用就是以棧頂的值作為key來訪問-2位置上的table。

lua_gettable(l, -2);

這時table中的第1個元素的值就放到棧頂了,你想怎麼使用就怎麼使用吧。

上面說的是訪問table中的乙個元素的方法,那要怎麼樣遍歷table中的所有元素呢?如果table是乙個以連續的整形作為key的table, 可以用下面方法:

int size = lua_objlen(l,-1);//相關於#table

for(int i = 1; i <= size; i++)

;

如果table中的key是任意值呢?可以用下面的方法:

lua_pushnill(l);

while(lua_next(l, -2))

這裡重點說明一下lua_next。它執行操作是這樣的,先判斷上乙個key的值(這個值放在棧頂,如果是nil,則表示當前取出的是table中第乙個元素的值),然後算出當前的key,這時先把棧頂出棧,將新key進棧,最後將新key對應的值進棧。這樣棧頂就是table中第乙個遍歷到的元素的值。用完這個值後,我們要把這個值出棧,讓key在棧頂以便繼續遍歷。當根據上乙個key值算不出下乙個key值時,lua_next返回0,結束迴圈。

今天學習了兩種遍歷c**中遍歷tabl的方法,讓我對lua的認識又深入了許多,由於之前太懶,而且對lua原始碼中「亂78糟「的命名感到恐懼,所以一直都沒有好好的深入學習lua,雖然現在的工作只用lua指令碼語言來程式設計,但還是很有必要了解一下lua的原始碼的,接下來好好加油吧!

Lua學習筆記 1

前段時間一直在尋找,究竟c 中嵌入哪種指令碼語言比較好呢?python,ruby,lua,perl 後來,開源社群的朋友很多都推薦lua,於是我也就開始學習lua程式設計.我的開發環境是vs.net 2003,新建乙個空的c console專案,再新建乙個main.cpp檔案,然後新增以下 incl...

Lua學習筆記 1

lua也是一種指令碼語言,和shell類似。學習這個是因為在使用redis做分布式鎖的時候有一種lua的寫法,所以就簡單的學習一下這個指令碼語言。其實但凡是指令碼語言都有一種執行方式就是互動式 什麼叫做互動式?就是類似於問答模式,輸入一條命令輸出結果 直接輸入lua,就進入了互動介面。可以自己玩一下...

LUA 元表學習筆記1

最近學習lua學習到元表這一塊,發現有點迷糊 於是查閱了一部分資料反覆敲 論證,記錄一下結果 因為自己也是菜鳥並不保證完全正確,這僅僅是我個人的理解 首先設定原表 普通表 t 元表 mt 把 mt 設為 t 的元表 setmetatable t,mt 返回 t 的元表,也就是 mt getmetat...