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时,调用了操作表函数将触发 assertoperator[]运算符 被重载 它接受一些常量作为参数 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(表数据查找)
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比较)
可以通过 == 和 < 操作符 比较两个对象
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堆栈