Lua学习笔记:C++操作Lua的表

前言
本篇在讲什么

C++操作Lua的表(table)
本篇适合什么

适合初学Lua的小白
适合需要C/C++和lua结合开发的人

本篇需要什么

Lua语法有简单认知
C/C++语法有简单认知
依赖Lua5.1的环境
依赖VS 2017编辑器

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


♠ 前景概要

Visual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本

Lua学习笔记:C/C++和Lua的相互调用

上述两篇文章介绍了如何搭建环境、C/C++和Lua之间如何进行数据交换,如果不清楚其中原理,建议了解后再学习本篇文章


♠ 读取Lua的表(table)

想在C++内读取Lua表内的值,有多种方式,下面我们介绍几种


♥ lua_gettable

我们这里简单介绍如何在C++代码当中读取Lua的表,我们先简单写一段Lua代码,补充全局表roleInfo

在这里插入图片描述

写一段C++代码,重点需要用到的函数是lua_gettable,用来获取栈中的表,运行后效果如下图2,成功获取并输出了表中的name字段对应的值

在这里插入图片描述
在这里插入图片描述

下面我们详细说一下lua_gettable的功能,和各个步骤都干了什么

  • 第一步:获取Lua中的全局表
lua_getglobal(L, "roleInfo");

在这里插入图片描述

这个就是通过函数lua_getglobal带上全局表的名字,将Lua中的表压入到栈内,执行后,栈的内容变得如上图所示,栈内只有一个表

  • 第二步:将需要获取的key压入到栈内
lua_pushstring(L, "name");

在这里插入图片描述

函数lua_gettable有个特性,执行的时候会从栈顶取一个值,用该值当key从表内获取数据,所以要将需要对应的key先压入到栈内,执行后栈的内容变得如上图所示,栈内两个数据,栈顶为key,栈底为表

  • 第三步:调用lua_gettable
lua_gettable(L, -2);

在这里插入图片描述

前文我们已经说了,此时栈内两个数据,table在栈底,索引是-2,执行后根据栈顶的key获取到value,然后将值压入到栈内,结果如上图所示


♥ lua_rawgeti和lua_getfield

同样的我们先写一段Lua代码,内包含不同key值的表roleInfo

在这里插入图片描述

再写一段C++代码,使用我们的lua_rawgetilua_getfield函数如下图,执行输出后如下图2

在这里插入图片描述
在这里插入图片描述

  • 第一步依然是将全局表现压入到栈内
lua_getglobal(L, "roleInfo");

在这里插入图片描述

  • 第二步:直接将key对应的值压入栈
lua_getfield(L, -1, "name");

lua_rawgeti(L, -2, 6);

在这里插入图片描述

lua_getfield可以直接将对应索引的表内的值压入到栈,key值必须为字符,上述代码意味着,获取索引为-1的表,然后去表中key为name的值,然后压入到栈内

lua_rawgeti功能相同,不过key值必须为整型,上述代码意味着,获取索引为-2的表,然后去表中key为6的值,然后压入到栈内


♠ 设置Lua的表(table)

我们在前文已经学习了如何去读取Lua的表,下面我们了解一下如何去修改和创建Lua的表


♥ 修改表内值

依然第一步我们先准备Lua代码,如下图所示,本次除全局表外,多了一个方法dump用来输出表的key和value

在这里插入图片描述

第二步在C++中利用利用lua_setfieldlua_rawseti方法来修改表内的值,修改后调用dump方法,输出内容变成修改后的值,如下图2

在这里插入图片描述
在这里插入图片描述

我们简单再分析一下内容

lua_setfield(L, -2, "name");

lua_rawseti(L, -2, 6);

方法lua_setfieldlua_rawseti功能相同,都是将栈内对应索引的值弹出,然后根据参数的key赋值到栈底的表内,二者区别是一个处理key为字符的情况,一个处理key为整型的情况

以上述代码为例,lua_setfield将索引为-2的值,赋值给栈底表内key为"name"的值

以上述代码为例,lua_rawseti将索引为-2的值,赋值给栈底表内key为6的值

我们再通过图例看一下

在这里插入图片描述

注:赋值都是给靠近栈底的第一个表


♥ 创建新表

我们也可以通过C API去创建一个新表,我们依旧先准备一段Lua代码,包含一个名为dump的方法,接受一个参数表,方法体内将表的key和value输出

在这里插入图片描述

我们在C++内通过函数lua_newtable创建一个新表压入到栈内,然后通过我们上文学习的lua_setfield和lua_rawseti方法,向表内设置数据,最后调用方法输出,效果如下

在这里插入图片描述
在这里插入图片描述

这里重点说一下lua_newtable方法,其作用就是创建一个空表压入栈内

也可以使用lua_createtable(lua_State *L, int narr, int nrec)方法创建,参数分配narr个array元素的空间和分配nrec个非array元素的空间

lua_newtable(L)等同于lua_createtable(L,0,0)

下面我们依然利用图例去理解这个过程

在这里插入图片描述


♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值