您的位置:首页 > 编程语言 > Lua

Lua.LearningLua.5-document-for-luaL_findtable-function

2015-08-14 15:48 417 查看

Learning Lua: 5 - Document for luaL_findtable() function

文档中没有找到luaL_findtable()函数的说明,这里尝试补充。

LUALIB_API const char *luaL_findtable (lua_State *L, int idx,
const char *fname, int szhint);


@brief

luaL_findtable()在由参数idx标识的target-table中查找名字为fname的table。 fname支持"tableA.tableB.tableC"这种

级联的方式来命名要查找的table,其中在target-table中以"tableA"为key的field的值需要是table类型,否则会返回"tableA"。

@parameters

L: lua_State

idx: target-table在lua_State对象L中的位置

fname: 在target-table中所要查找的table的名字。支持"GrandfatherTableName.ParentTableName.TableName"这种形式。

szhint: 如果查找的table不存在,则会新创建fname对应的table,szhint是创建新table时non-array elements的提示值。参见"lua_createtable()"。

@return

成功:返回NULL; L中的top位置(即: -1的位置)会保留找到的table。

异常:返回fname中有问题的部分; L 会被复原为调用luaL_findtable()前的状态。

luaL_findtable()代码如下:

LUALIB_API const char *luaL_findtable (lua_State *L, int idx,
const char *fname, int szhint) {
const char *e;
  lua_pushvalue(L, idx); // lua_pushvalue(): Pushes a copy of the element at the given valid index onto the stack. // A
   do {
e = strchr(fname, '.');
if (e == NULL) e = fname + strlen(fname);
lua_pushlstring(L, fname, e - fname); // lua_pushlstring(): Pushes the string pointed to by [code]s
with size
len
onto the stack. // B
lua_rawget(L, -2);    // lua_rawget(): Similar to
lua_gettable
, but does a raw access // C
if (lua_isnil(L, -1)) { /* no such field? */
lua_pop(L, 1); /* remove this nil */
lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */   // D
lua_pushlstring(L, fname, e - fname);
lua_pushvalue(L, -2);
lua_settable(L, -4); /* set new table into field */       // E
}
else if (!lua_istable(L, -1)) { /* field has a non-table value? */
lua_pop(L, 2); /* remove table and value */
return fname; /* return problematic part of the name */
}
lua_remove(L, -2); /* remove previous table */    // F
fname = e + 1;
} while (*e == '.');
return NULL;
}[/code]

lua_gettable()

void lua_gettable (lua_State *L, int index);


"Pushes onto the stack the value
t[k]
, where
t
is the value at the given valid index and
k
is the value at the top of the stack.

This function pops the key from the stack (putting the resulting value in its place). As in Lua, this function may trigger a metamethod for the "index" event " Ref[1]

lua_createtable()

void lua_createtable (lua_State *L, int narr, int nrec);


"Creates a new empty table and pushes it onto the stack. The new table has space pre-allocated for
narr
array elements and
nrec
non-array elements." Ref[1]

lua_settable()

void lua_settable (lua_State *L, int index);


"Does the equivalent to
t[k] = v
, where
t
is the value at the given valid index,
v
is the value at the top of the stack, and
k
is the value just below the top.

This function pops both the key and the value from the stack. As in Lua, this function may trigger a metamethod for the "newindex" event" Ref[1]

lua_remove()

void lua_remove (lua_State *L, int index);


"Removes the element at the given valid index, shifting down the elements above this index to fill the gap. Cannot be called with a pseudo-index, because a pseudo-index is not an actual stack position." Ref[1]

Reference

1. http://www.lua.org/manual/5.1/manual.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: