从 C 中找到 Lua 数字的符号。

我有一个看起来很琐碎的问题。

假设在 Lua 栈的顶部有一个数字。我想要在 C 中找出这个数字是正数、负数还是零。

一个朴素的解决方法是:

lua_Number num = lua_tonumber(L, -1);
if (num > 0)
   print("positive")
else if (num < 0)
   print("negative")
else
   print("zero")

但是,在 Lua 5.3 中这可能不行,因为如果栈上是一个 Lua 整数 (lua_Integer),它可能不适合我们的 num 变量 (它是 lua_Number)。

那么,我该如何编写我的 C 代码,使其在 Lua 5.1/5.2 和 Lua 5.3 中都能工作呢?

(顺便说一下,我只关心符号,而不是数字本身的原因是,这个数字是一个排序算法的比较函数的返回值。它是比较两个项的结果。)

点赞
用户142162
用户142162

一种可能的解决方案是让 Lua 为您进行比较操作。这可以使用 lua_compare (或 lua_lessthan,对于 LuaJIT 和 Lua 5.1) 来实现:

#if LUA_VERSION_NUM == 501
  #define LUA_LESS_THAN(state, index1, index2) lua_lessthan(state, index1, index2)
#elif LUA_VERSION_NUM > 501
  #define LUA_LESS_THAN(state, index1, index2) lua_compare(state, index1, index2, LUA_OPLT)
#endif

lua_pushnumber(L, 0);
if (LUA_LESS_THAN(L, -1, -2)) {
  // 0 < num
} else if (LUA_LESS_THAN(L, -2, -1)) {
  // 0 > num
} else {
  // 0 == num
}
lua_pop(L, 1);
2014-11-24 12:36:19