只是獲取一個全局變量什么的太沒意思了,今天我們來玩?zhèn)€高難度的——獲取Lua表結(jié)構(gòu)的數(shù)據(jù)。
(旁白:O O!我是不是該說點什么?)
上一章傳送門:https://www.jb51.net/article/55093.htm
1. 什么是table
table是Lua里最強大的數(shù)據(jù)類型,我們可以當成是數(shù)組,但是它又和數(shù)組有點不一樣,建議大家看看Lua的語法教程,因為我對table也沒有熟悉到可以給大家解釋的程度。
(旁白:那你還寫什么教程。。。)
2. 獲取table變量
現(xiàn)在,我們給helloLua.lua文件添加一個table全局變量:
復(fù)制代碼 代碼如下:
-- helloLua.lua文件
myName = "beauty girl"
helloTable = {name = "mutou", IQ = 125}
我們看到,多了一個helloTable的變量,它和數(shù)組十分相似,又和HashMap有點類似,總之它很強大。
(旁白:我覺得亮點是,你的IQ有125?我覺得乘以2的話,還有點可能~!)
話說,125乘以2等于多少?…250 ….O O!
獲取helloTable變量的方式和以前是一樣的:
復(fù)制代碼 代碼如下:
/* 取得table變量,在棧頂 */
lua_getglobal(pL, "helloTable");
這樣,helloTable變量就被存放到棧頂。
可我們并不是要取table變量,因為C++中是無法識別Lua的table類型的,所以我們要取得table中具體的值,也就是name和IQ的值。
3. lua_gettable函數(shù)
有一個和lua_getglobal類似的函數(shù),叫做lua_gettable,顧名思義,它是用來取得table相關(guān)的數(shù)據(jù)的。
(旁白:廢話少點好吧= =)
lua_gettable函數(shù)會從棧頂取得一個值,然后根據(jù)這個值去table中尋找對應(yīng)的值,最后把找到的值放到棧頂。
lua_pushstring()函數(shù)可以把C++中的字符串存放到Lua的棧里;
然后再用lua_gettable()取執(zhí)行前面所說的步驟,lua_gettable的第二個參數(shù)是指定的table變量在棧中的索引。
(旁白:小笨木,我被你繞暈了。。。)
為了照顧旁白這個笨蛋,我們畫個圖來理解:
這是初始狀態(tài),堆棧里還沒有任何東西,那么,現(xiàn)在要先把helloTable變量放到棧頂:
復(fù)制代碼 代碼如下:
/* 取得table變量,在棧頂 */
lua_getglobal(pL, "helloTable");
然后就變成了這樣:
接著,我們要取得table的name對應(yīng)的值,那么,先要做的就是把”name”字符串入棧:
復(fù)制代碼 代碼如下:
/* 將C++的字符串放到Lua的棧中,此時,棧頂變?yōu)椤皀ame”, helloTable對象變?yōu)闂5?*/
lua_pushstring(pL, "name");
然后變成這樣:
(旁白:不帶這樣啊,你偷偷加上了棧的索引~!)
注意了,我把棧的索引也加上了,因為我們即將要使用,這次我們用負數(shù)索引(不了解負數(shù)的索引的朋友請閱讀第03章的教程哈~)。
由于”name”的入棧,現(xiàn)在helloTable變量已經(jīng)不在棧頂了。
接著,我們調(diào)用要做最重要的一步了,取得name在table中對應(yīng)的值:
復(fù)制代碼 代碼如下:
/*
從table對象尋找“name”對應(yīng)的值(table對象現(xiàn)在在索引為-2的棧中,也就是當前的棧底),
取得對應(yīng)值之后,將值放回棧頂
*/
lua_gettable(pL, -2);
此時,棧變成這樣:
(旁白:發(fā)生什么事?為什么“mutou”突然出現(xiàn)在棧頂?!為毛!是你自己畫上去的吧!)
lua_gettable倒底做了什么事情?
首先,我們來解釋一下lua_gettable的第二個參數(shù),-2是什么意思,-2就是剛剛helloTable變量在棧中的索引。
然后,Lua會去取得棧頂?shù)闹担ㄖ暗臈m斒恰眓ame”),然后拿著這個值去helloTable變量中尋找對應(yīng)的值,當然就找到”mutou”了。
最后,Lua會把找到的值入棧,于是”mutou”就到了棧頂了。
(旁白:你妹紙的。。。沒事,我就罵罵人)
最后我們只需要取出棧頂?shù)臄?shù)據(jù)就可以了,完整代碼如下:
復(fù)制代碼 代碼如下:
/* 初始化 */
lua_State* pL = lua_open();
luaopen_base(pL);
/* 執(zhí)行腳本 */
luaL_dofile(pL, "helloLua.lua");
/* 取得table變量,在棧頂 */
lua_getglobal(pL, "helloTable");
/* 將C++的字符串放到Lua的棧中,此時,棧頂變?yōu)椤皀ame”, helloTable對象變?yōu)闂5?*/
lua_pushstring(pL, "name");
/*
從table對象尋找“name”對應(yīng)的值(table對象現(xiàn)在在索引為-2的棧中,也就是當前的棧底),
取得對應(yīng)值之后,將值放回棧頂
*/
lua_gettable(pL, -2);
/* 現(xiàn)在表的name對應(yīng)的值已經(jīng)在棧頂了,直接取出即可 */
const char* sName = lua_tostring(pL, -1);
CCLOG("name = %s", sName);
好了,本章到此結(jié)束。
您可能感興趣的文章:- Lua的table庫函數(shù)insert、remove、concat、sort詳細介紹
- Lua中table的幾種構(gòu)造方式詳解
- Lua中對table排序?qū)嵗?/li>
- Lua中遍歷數(shù)組和table的4種方法
- Lua中的table學習筆記
- Lua中使用table.concat連接大量字符串實例
- Lua中的table淺析
- Lua判斷Table是否為空的方法(空的table即{})
- Lua中使用table實現(xiàn)的其它5種數(shù)據(jù)結(jié)構(gòu)
- 深入談?wù)刲ua中神奇的table