扩展Lua:检查传递给函数的参数数量

8

我希望创建一个新的Lua函数。

我可以使用带参数的函数(遵循这个链接)来读取函数参数。

static int idiv(lua_State *L) {
  int n1 = lua_tointeger(L, 1); /* first argument */
  int n2 = lua_tointeger(L, 2); /* second argument */
  int q = n1 / n2; int r = n1 % n2;
  lua_pushinteger(L, q); /* first return value */
  lua_pushinteger(L, r); /* second return value */
  return 2; /* return two values */
}

我想了解一种方法来知道传递给函数的参数数量,以便在用户没有使用两个参数调用函数时打印一条消息。
当用户输入时,我希望执行该函数。
idiv(3, 4)

并在出现错误时打印错误信息
idiv(2)
idiv(3,4,5)
and so on...

3
Lua通常的做法是不会对多余的参数抱怨。 - lhf
那么少一些参数呢? - Jepessen
1
参数更少是另一回事。如果可以使用合理的默认值,则使用它们。否则,引发错误。 - lhf
事实上,我需要用户指定我所需的确切参数数量。我不想使用默认值,因为用户应该始终清楚自己在使用什么。 - Jepessen
1个回答

17
您可以使用lua_gettop()来确定传递给C Lua函数的参数数量:

int lua_gettop(lua_State *L);
返回堆栈中顶部元素的索引。由于索引从1开始,所以此结果等于堆栈中元素的数量(因此0表示空堆栈)。

static int idiv(lua_State *L) {
  if (lua_gettop(L) != 2) {
    return luaL_error(L, "expecting exactly 2 arguments");
  }
  int n1 = lua_tointeger(L, 1); /* first argument */
  int n2 = lua_tointeger(L, 2); /* second argument */
  int q = n1 / n2; int r = n1 % n2;
  lua_pushinteger(L, q); /* first return value */
  lua_pushinteger(L, r); /* second return value */
  return 2; /* return two values */
}

谢谢。这正是我所需要的! - Jepessen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接