尽管 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 是其他元素的期望数量。