luaplus 与官方文档慢慢扯(四)

本文介绍LuaObjects的使用方法,包括值的存储与交换、表的创建与操作、对象复制及比较等内容,帮助读者掌握Lua与C++混合编程的核心技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Value Storage(值储存? 与lua交换值)

 

一般使用lua c api  push* 来把值压入堆栈

LuaObjects 提供了另一种实现 它不是基于堆栈的  (具体如何使用 暂时不懂 以后再回头看)

使用Assign*()系列函数 把值分发进LuaObject 

下面是 Assign*系列函数

 

  • AssignNil(LuaState* state)
  • AssignBoolean(LuaState* state, bool value)
  • AssignInteger(LuaState* state, int value)
  • AssignNumber(LuaState* state, double value)
  • AssignString(LuaState* state, const char* value)
  • AssignWString(LuaState* state, const lua_WChar* value)
  • AssignUserData(LuaState* state, void* value)
  • AssignLightUserData(LuaState* state, void* value)
  • AssignObject(LuaState* state, LuaObject& value)
  • AssignNewTable(LuaState* state, int narray = 0, int nhash = 0)

 

 

 

 

 

 

Table Creation(创建table)

两种方法创建table

第一种方法

使用 CreateTable() 函数  CreateTable()类似于 Set*()函数

在全局范围内创建一个空表 参数是这个表的 key名

 

第二种方法 是使用 LuaObject 调用AssignNewTable()  在当前的 LuaObject中创建一个空表

 

 

 

LuaObject 是一个表  就可以使用操作表的函数  

有以下几个函数用来获取表成员数

这里有一个表

 

MyTable =
{
    WindSpeed = 50,
    Value = 'Hello',
    10,
    20,
    30
}
调用 GetN() 返回3   GetN()内部使用的是 table.getn() 来获取表成员数
table.getn()只计算从 key 1开始的连续以数值作为key的成员
GetCount() 也是从key 1开始计算数量 不过它的执行速度更快
 GetTableCount()  函数则返回table内的所有元素数量  对 MyTable而言  它返回5



Table Data Lookups(表数据操作)

当 LuaObject 是一个表的时候 操作table的 函数将可用 如果 LuaObject不是table时,调用了操作表函数将触发 assert
operator[]运算符 被重载 它接受一些常量作为参数 const char *, int , LuaStackObject 或者LuaObject
使用operator[] 的话 代码看起来像是lua脚本代码
例子:

不使用 operate [] 重载运算符 内部使用的函数
  • GetByName(const char* key)
  • GetByIndex(int index)
  • GetByObject(const LuaObject& obj)
  • GetByObject(const LuaStackObject& obj)

 

 

Table Data Storage(table数据储存 ?)

LuaObject 对表操的作 通过 Set*()一系列函数实现

而每一种 Set*()函数 都有3个重载函数 

Set*()系列函数 的第一个参数是key  key可以是 const char * ,int 和 LuaObject

下面是Set*()系列函数

 

    • SetNil(key)
    • SetBoolean(key, bool value)
    • SetInteger(key, int value)
    • SetNumber(key, double value)
    • SetString(key, const char* value)
    • SetWString(key, const lua_WChar* value)
    • SetUserData(key, void* value)
    • SetLightUserData(key, void* value)
    • SetObject(key, LuaObject& value)

 

 

每个 Set*() 函数返回当前对象的引用,所以在单个语句中可以出现多个 Set*() 函数

 

例子:
 

Table Data Lookups(表数据查找)

Lookup() 函数提供了一种简单的方法递归查找指定表项,它的字符串参数接受以 .分隔表示的table
还是上面的例子
 

Table Manipulation(对表的操作)

 

一些对表的插入 移除 排序等操作 简单的封装在了 LuaObject 

现在已有的函数  Insert() ( table.insert), Remove() (table.remove), and Sort() (table.sort)

 

 

 

Cloning Objects(复制Object对象)

LuaObject 提供了一个方法 Clone() 允许简单的复制 LuaObject

对于lua的表 执行深度复制 对于其他任何值 执行简单复制 

一般情况下够用了

Clone()并不处理循环的表  如果对循环的表执行 Clone() 可能导致内存不足或者堆栈溢出 

 

 

Comparing Objects(Object比较)

可以通过 == 和 < 操作符 比较两个对象 

 

内部的比较是通过 lua_equal() 和 lua_lessthan()函数实现的 

 

 

 

 

 

Implicit Conversion Between LuaStackObject and LuaObject(LuaObject 和 LuaStackObject的隐式转换)

 

很多时候 需要访问lua堆栈上的对象

例如 回调函数收到一个LuaStackObjects 数组 

在写代码时 LuaStackObject 和LuaObject 的方法非常的相似 

然而 LuaObjects 对象可以不用考虑堆栈 所以 两个对象间的转换还是有点必要的

例:

 

 

 

Pushing a LuaObject onto the Lua Stack(把LuaObject 放入 Lua堆栈)

一般情况下 把 LuaObject放入 lua堆栈是很罕见的

虽然如此 还是可以通过 Push() 函数 把LuaObject放入lua堆栈

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值