Lua程序设计(八十八)

本文介绍了Lua C API中的lua_getfield和lua_setfield函数,这两个函数分别用于方便地获取和设置表中由字符串键标识的值。在Lua 5.3中,lua_getfield返回结果的类型,简化了类型检查。同时,文章还提到了lua_createtable函数,用于预先分配表的空间,以优化性能。
摘要由CSDN通过智能技术生成

尽管 Lua 语言的 C API 追求简洁性,但 Lua 也没有做的过于激进。因此, C API 为一些常用的操作提供了一些便利的方法。

由于通过字符串类型来检索表是很常见的操作,因此 Lua 语言针对这种情况提供了一个特定版本的 lua_gettable 函数:lua_getfield。使用这个函数,可以将 getcolorfield 中的如下两行代码:

lua_pushstring(L,key);
lua_gettable(L, -2);

重写为:

lua_getfield(L, -1, key);

因为没有把这个字符串(即变量 key ) 压入栈内,所以调用 lua_getfield 时,表的索引应仍然是-1。

由于经常要检查 lua_gettable 返回值的类型,因此,在 Lua 5.3 中,该函数(以及与 lua_getfield 类似的函数)会返回结果的类型。所以,我们可以简化 getcolorfield 中后续的访问和检查:

if( lua_getfield( L, -1, key ) != LUA_TNUMBER )
	error( L, "invalid component in background color");

与此同时,Lua 语言还未字符串类型的键提供了一个名为 lua_setfield 的特殊版本的 lua_settable 。使用该函数,可以重写之前对 setcolorfield 的定义:

void setcolorfield( lua_State *L, const char *index, int value) {
	lua_pushnumber( L, (double)value / MAX_COLOR );
	lua_setfield(L, -2, index);
}

作为一个小优化,我们还可以在函数 setcolor 中替代对函数 lua_newtable 的使用。Lua 提供了一个函数 lua_createtable, 它可以创建表并为其元素预分配空间。Lua 将这些函数声明为:

void lua_createtable( lua_State *L, int narr, int nrec );
#define lua_newtable( L ) lua_createtable(L, 0, 0);

参数 narr 是表中连续元素的期望个数, 而 nrec 是其他元素的期望数量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值