How do I get the table length of a lua table in c?
我有一个从lua调用的c函数。第一个参数是一个表。该表被用作基础api的数字输入数组。所以现在我的代码看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13
| int n = 0;
lua_pushnil ( L );
while ( lua_next ( L, 2 ) ) {
n++;
lua_pop ( L, 1 );
}
int *flat = alloca ( n * 4 );
lua_pushnil ( L );
int i = 0;
while ( lua_next(L,2) ) {
flat[i++] = (int)lua_tonumber( L, -1 );
lua_pop ( L, 1 );
} |
我盲目键入了代码,请原谅错误。也没有错误检查。但是问题是我必须两次执行while循环。有避免这种情况的简便方法吗?我想针对输入良好的情况进行优化-一个整数表。
- 通常,我会在Lua文档中拒绝投票给谁的答案。但是考虑到函数名称不是很明显,并且明显的Google搜索找不到它,我会让它滑动。
-
对此感到抱歉,但是lua似乎对Google尤其困难。另外,在5.1和5.2之间有许多更改。别误会我的意思,我学到很多东西,但是很难找到参考手册。例如,前面我花了一些时间重新实现luaL_checklong,只是因为我错过了正确的名称。
您要查找的函数是不直观的名为lua_objlen,或者在Lua 5.2中为lua_len(如果希望避免元方法调用,则为lua_rawlen)。它起着许多作用(尽管有些作用,例如字符串的长度,当您仅可以使用lua_tolstring来获取字符串及其长度时不是很有用),因此您应该熟悉它。
- 应该注意的是,当表中包含连续整数以外的其他内容时,此方法可能无法返回正确的数字-请参见此内容。
-
实际上,只要表由不为nil的连续对象(不仅是整数)组成,就可以使用。在Lua中,这称为序列。请注意,在Lua 5.1中,定义稍有不同,但与Lua 5.2相比,定义更为简单。另请注意,在Lua 5.2中,lua_objlen已重命名为lua_rawlen,并且不遵守__len元方法。
-
感谢您的5.2更新。我应该提到我正在使用5.2。
-
@catwell:它没有重命名为lua_rawlen;它分为两个功能:lua_len和lua_rawlen,与lua_gettable和lua_rawget一样。一种允许元方法,另一种不允许。
-
是的,我的意思是lua_objlen的等效项是lua_rawlen(不关心__len)。 lua_len是一个新函数,其(afaik)在5.1中没有等效项,并且对应于#运算符。