【问题标题】:How do I get the table length of a lua table in c?如何在c中获取lua表的表长度?
【发布时间】:2012-09-18 23:48:02
【问题描述】:

我有一个从 lua 调用的 c 函数。第一个参数是一个表格。该表被滥用为底层 api 的输入数字数组。所以现在我的代码看起来像这样:

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 文档中找到答案的问题。但是考虑到函数名不明显,而且明显的谷歌搜索也找不到,我就让它滑动吧。
  • 很抱歉,但 lua 似乎特别难以用谷歌搜索。再加上 5.1 和 5.2 之间有很多变化。不要误会我的意思,我学到了很多东西,但是参考手册很难搜索。例如之前我花了一些时间重新实现 luaL_checklong,只是因为我错过了正确的名称。

标签: lua


【解决方案1】:

您要查找的函数名称不直观,名为 lua_objlen,或者在 Lua 5.2 中为 lua_len(如果您希望避免元方法调用,则有一个 lua_rawlen)。它有很多作用(虽然有些作用,比如字符串的长度,在你可以使用lua_tolstring 来获取字符串及其长度时并不是很有用),所以你应该熟悉它。

【讨论】:

  • 应该注意,当表格由非连续整数组成时,这可能不会返回正确的数字 - 请参阅 thisthis
  • 实际上,只要表由不为零的连续事物组成,而不仅仅是整数,它就可以工作。在 Lua this is called a 'sequence'。请注意,Lua 5.1 中的定义略有不同,但 Lua 5.2 中的定义更简单。另请注意,在 Lua 5.2 中,lua_objlen 已重命名为 lua_rawlen,并且 尊重 __len 元方法。
  • 感谢您的 5.2 更新。我应该提到我使用的是 5.2。
  • @catwell:它没有重命名为lua_rawlen;它被拆分为两个函数:lua_lenlua_rawlen,就像lua_gettablelua_rawget 一样。一个允许元方法,另一个不允许。
  • 是的,我的意思是lua_objlen 的等价物是lua_rawlen(不关心__len)。 lua_len 是一个新函数,(afaik) 在 5.1 中没有等效函数,对应于 # 运算符。
猜你喜欢
  • 2016-12-04
  • 2013-12-07
  • 1970-01-01
  • 2015-05-21
  • 2014-12-25
  • 2016-01-08
  • 2016-01-12
  • 2021-06-13
  • 2014-08-19
相关资源
最近更新 更多