只是獲取乙個全域性變數什麼的太沒意思了,今天我們來玩個高難度的——獲取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 ...