LUA中的类型强转

 

众所周知,lua里的变量都没有类型的定义,是啥东西直接拿出来用就行,用错了运行时会报错不执行,类型强转这种操作似乎没啥用武之地。的确在单独使用脚本语言的环境里语言本身并不关心类型,但如果要与宿主语言交互,并且还利用了userdatalightuserdata对象与C里面的操作和变量关联,那类型强转就很有意义了。

LUA5.1版本后注册对象就逐步取代注册接口成为与宿主交互的首选方式,拿luatinker举例其注册对象的原理是为每个类型注册以类型命名的一个tabletable里记录的是该类在C里面成员变量和成员函数的相对偏移地址,并且把它和表项名所bind,而表项名就是注册给lua使用的对应的类变量名和函数名(e.g. class A{int m_a; int m_b;} 对应A::m_b变量的在table里相对就存在一个名为’m_b’ 表项,而值就是0x00000004,在传入userdatalightuserdata的时候把它们的metatable附上由类型注册的那个table。使用 ‘.’ 调用类变量或 ‘:’ 调用类函数的时候把lightuserdata作为类的this指针传回加上注册的偏移值就可以访问对应的变量和函数了。这种对象访问的实现方式很多lua的封装库都采用了,而luatinker在此之上还利用template来实现对象和类型,userdatametatable表名之间的关联。使用者在调用的时候不用指明要挂接的metatable,统一交给C++编译器对模板的推导。

不可否认模板绝大多数情况下发挥得很给力,但也存在一个现象:编译期抉择的模板类型解决不了运行时才决定的派生类类型。 假设一个常见的应用:有个 lua function 接受值为CBase*userdata作为参数,运行时传入的是它的一个派生类CRole*,而在脚本中希望能掉用到派生类的操作sendMsg。由于对象体系导致CBase并没有sendMsg的虚接口(基类无法为所有的派生类用到的操作都提供虚接口。而往往接口为了统一也只把基类类型作为传递的参数类型) 即便用在lua环境里使用 class_addclass_def引入了CRolesendMsg操作,也用class_inh申明了CRoleCBase的继承关系(这只是强转能产生作用的前提),一旦调用role:sendMsg 同样是一个表对象操作错误。回头想想对照CLUA遇到的情况是相似的,传入 基类指针|userdata 需要调用派生类接口,编译器 编译时|运行时 通过 类型检查|模板推导结果 只能 查找出基类对应的函数表 |userdata挂接上以基类命名的metatable。既然情况一样,那C解决方案也适用LUA --- 强转

知道LUA类和操作的实现,强转也还算简单。 把userdatametatable重新设置成派生类的metatable 就可以了。 首先引入 lua_debug库,然 后再脚本使用变量role前,写上这么一句debug.setmetatable(role,CRole) ,不想引入debug库可以用lua_setmetatable自己实现一个C api的操作。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 本套课程分为基础与级两部分,分别就lua语言的各方面知识点进行探讨,学习完本套课程,对于后续Xlua(Tolua等框架)技术的学习提供大的语言技术保证。       本套lua课程采用入门与商业级两种开发IDE进行教学:入门级的SciTE内置IDE与商业级的IDEA lua插件。本套课程学习完毕,对于除了传统手游外,在VR、AR、商业级大型应用程序、嵌入式设备开发等领域都有较的指导作用。           《lua级篇》分为:“函数的进阶”、“字符串进阶”、“Table进阶”、“元表”、“OOP面向对象”、“协同程序”、“IO操作”、“调试与运行”等八个大的章节,详细深入讲解lua开发的方方面面。        内容包含lua可变参数、闭包、模块、函数尾调用、字符串模式匹配、字符串不变性原理、矩阵、链表、元表详解与应用、协同的生命周期与生产消费者问题、lua文件各种读写操作、lua执行外部代码与错误异常处理垃圾收集机制等。       最后,lua级篇的学习,对于广大学员开发商业级lua热更新技术,具有不可替代的重要作用! 热更新系列(技术含量:高级):B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架()》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值