1. 什么是table
是Lua里最强大的数据类型,我们可以当成是数组,但是它又和数组有点不一样,建议大家看看Lua的语法教程,因为我对table也没有熟悉到可以给大家解释的程度。
2. 获取table变量
helloLua.lua文件添加一个table全局变量:
1. -- helloLua.lua文件
2. myName = "beauty girl"
3.
4. helloTable = {name = "mutou", IQ = 125}
helloTable的变量,它和数组十分相似,又和HashMap有点类似,总之它很强大。
helloTable变量的方式和以前是一样的:
1. /* 取得table变量,在栈顶 */
2. "helloTable");
helloTable变量就被存放到栈顶。
table变量,因为C++中是无法识别Lua的table类型的,所以我们要取得table中具体的值,也就是name和IQ的值。
3. lua_gettable函数
lua_getglobal类似的函数,叫做lua_gettable,顾名思义,它是用来取得table相关的数据的。
函数会从栈顶取得一个值,然后根据这个值去table中寻找对应的值,最后把找到的值放到栈顶。
函数可以把C++中的字符串存放到Lua的栈里;
lua_gettable()取执行前面所说的步骤,lua_gettable的第二个参数是指定的table变量在栈中的索引。
(旁白:小笨木,我被你绕晕了。。。)
为了照顾旁白这个笨蛋,我们画个图来理解:
helloTable变量放到栈顶:
1. /* 取得table变量,在栈顶 */
2. "helloTable");
然后就变成了这样:
table的name对应的值,那么,先要做的就是把”name”字符串入栈:
1. /* 将C++的字符串放到Lua的栈中,此时,栈顶变为“name”, helloTable对象变为栈底 */
2. "name");
然后变成这样:
03章的教程哈~)。
helloTable变量已经不在栈顶了。
name在table中对应的值:
1. /*
2. 从table对象寻找“name”对应的值(table对象现在在索引为-2的栈中,也就是当前的栈底),
3. 取得对应值之后,将值放回栈顶
4. */
5. lua_gettable(pL, -2);
此时,栈变成这样:
倒底做了什么事情?
lua_gettable的第二个参数,-2是什么意思,-2就是刚刚helloTable变量在栈中的索引。
Lua会去取得栈顶的值(之前的栈顶是”name”),然后拿着这个值去helloTable变量中寻找对应的值,当然就找到”mutou”了。
Lua会把找到的值入栈,于是”mutou”就到了栈顶了。
最后我们只需要取出栈顶的数据就可以了,完整代码如下:
1. /* 初始化 */
2. lua_State* pL = lua_open();
3. luaopen_base(pL);
4.
5. /* 执行脚本 */
6. "helloLua.lua");
7.
8. /* 取得table变量,在栈顶 */
9. "helloTable");
10.
11. /* 将C++的字符串放到Lua的栈中,此时,栈顶变为“name”, helloTable对象变为栈底 */
12. "name");
13.
14. /*
15. 从table对象寻找“name”对应的值(table对象现在在索引为-2的栈中,也就是当前的栈底),
16. 取得对应值之后,将值放回栈顶
17. */
18. lua_gettable(pL, -2);
19.
20. /* 现在表的name对应的值已经在栈顶了,直接取出即可 */
21. const char* sName = lua_tostring(pL, -1);
22. "name = %s", sName);