獲取Lua表結構(table)資料例項

2022-09-20 12:42:14 字數 2766 閱讀 2233

只是獲取乙個全域性變數什麼的太沒意思了,今天我們來玩個高難度的——獲取lua表結構的資料。

(旁白:o o!我是不是該說點什麼?)

上一章傳送門:

1. 什麼是table

table是lua裡最強大的資料型別,我們可以當成是陣列,但是它又和陣列有點不一樣,建議大家看看lua的語法教程,因為我對table也沒有熟悉到可以給大家解釋的程度。

(旁白:那你還寫什麼教程。。。)

2. 獲取table變數

現在,我們給hellolua.lua檔案新增乙個table全域性變數:

複製** **如下:

-- hellolua.lua檔案

myname = "beauty girl"

hellotable =

我們看到,多了乙個hellotable的變數,它和陣列十分相似,又和hashmap有點類似,總之它很強大。

(旁白:我覺得亮點是,你的iq有125?我覺得乘以2的話,還有點可能~!)

話說,125乘以2等於多少?…250 ….o o!

獲取hellotable變數的方式和以前是一樣的:

複製** **如下:

/* 取得table變數,在棧頂 */

lua_getglobal(pl, "hellotable");

這樣,hellotable變數就被存放到棧頂。

可我們並不是要取table變數,因為c++中是無法識別lua的table型別的,所以我們要取得table中具體的值,也就是name和iq的值。

3. lua_gettable函式

有乙個和lua_getglobal類似的函式,叫做lua_gettable,顧名思義,它是用來取得table相關的資料的。

(旁白:廢話少點好吧= =)

lua_gettable函式會從棧頂取得乙個值,然後根據這個值去table中尋找對應的值,最後把找到的值放到棧頂。

lua_pushstring()函式可以把c++中的字串存放到lua的棧裡;

然後再用lua_gettable()取執行前面所說的步驟,lua_gettable的第二個引數是指定的table變數在棧中的索引。

(旁白:小笨木,我被你繞暈了。。。)

為了照顧旁白這個笨蛋,我們畫個圖來理解:

這是初始狀態,堆疊裡還沒有任何東西,那麼,現在要先把hellotable變數放到棧頂:

複製** **如下:

/* 取得table變數,在棧頂 */

lua_getglobal(pl, "hellotable");

然後就變成了這樣:

接著,我們要取得table的name對應的值,那麼,先要做的就是把」name」字串入棧:

複製** **如下:

/* 將c++的字串放到lua的棧中,此時,棧頂變為「name」, hellotable物件變為棧底 */

lua_pushstring(pl, "name");

然後變成這樣:

(旁白:不帶這樣啊,你偷偷加上了棧的索引~!)

注意了,我把棧的索引也加上了,因為我們即將要使用,這次我們用負數索引(不了解負數的索引的朋友請閱讀第03章的教程哈~)。

由於」name」的入棧,現在hellotable變數已經不在棧頂了。

接著,我們呼叫要做最重要的一www.cppcns.com步了,取得name在table中對應的值:

複製** **如下:

/*         從table物件尋找「name」對應的值(table物件現在在索引為-2的棧中,也就是當前的棧底),

取得對www.cppcns.com應值之後,將值放回棧頂

*/lua_gettable(pl, -2);

此時,棧變成這樣:

(旁白:發生什麼事?為什麼「mutou」突然出現在棧頂?!為毛!是你自己畫上去的吧!)

lua_gettable倒底做了什麼事情?

首先,我們來解釋一下lua_gettable的第二個引數,-2是什麼意思,-2就是剛剛hellotable變數在棧中的索引。

然後,lua會去取得棧頂的值(之前的棧頂是」name」),然後拿著這個值去hellotable變數中尋找對應的值,當然就找到」mutou」了。

最後,lua會把找到的值入棧,於是」mutou」就到了棧頂了。

(旁白:你妹紙的。。。沒事,我就罵罵人)

最後我們只需要取出棧頂的資料就可以了,完整**如下:

複製** **如下:

/* 初始化 */

lua_state* pl = lua_open();

luaopen_base(pl);

/* 執行指令碼 */

lual_dofile(pl, "hellolu程式設計客棧a.lua");

/* 取得table變數,在棧頂 */

lua_getglobal(pl, "hellotable");

/* 將c++的字串放到lua的棧中,此時,棧頂變為「name」, hellotable物件變為棧底 */

lua_pushstring(pl, "name");

/* 從程式設計客棧table物件尋找「name」對應的值(table物件現在在索引為-2的棧中,也就是當前的棧底),

取得對應值之後,將值放回棧頂

*/lua_gettable(pl, -2);

/* 現在表的name對應的值已經在棧頂了,直接取出即可 */

const char* sname = lua_tostring(pl, -1);

cclog("name = %s", sname);

好了,本章到此結束。

本文標題: 獲取lua表結構(table)資料例項

本文位址:

lua 輸出 table 樹結構

初學者肯定納悶 lua 沒有陣列,也沒有資料結構。這是為什麼呢。細心的同學可以發現它有乙個table。對,就是它了,它能實現你所以想要的結構。想要什麼結構,括 起來就好了,也可以通過迴圈資料組成自己想要的結構,方便讀取。在這裡我就先不講table 是怎麼做結構的了,初學者嘛,別人寫好了結構的你得用吧...

Lua語言之table表

table有兩種形式,陣列形式與鍵值對形式。一 table基本用法 1.table基本使用 初始化 table 表名 賦值 陣列形式 newtable 0 beijing 即同陣列一樣改變下標進行賦值 鍵值對形式 newtable2 xian shanxi 遍歷 陣列形式 for key,value...

Lua基礎學習 table表

table 是乙個 關聯陣列 在 lua 中可以用任意型別的值來作為陣列的索引,但是這個值不能是 nil,同樣也可以 用任意型別的值作為陣列的value,nil也可以。1 陣列的索引可以是數字或者是字串,所有索引值都需要用 和 括起來 如果是字串還可以去掉引號和中括號 但是數字下標不可以。注意 2 ...