我有一个似乎微不足道的问题。
让我们说在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中工作?
(顺便说一句,我之所以只对符号感兴趣,而不是对数字本身感兴趣,是因为这个数字是排序算法的比较函数的返回值。它的结果是比较两个项目。)
答案 0 :(得分:3)
一种可能的解决方案是让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);