Lua小坑之整数
在最近的一次开发中,需要将两个整数做除法,例如以下简单语句:
c=a/b
由于a和b都是整数,因此我又想当然地认为c也是整数,而实际上Lua将c转换成浮点数,导致后续逻辑判断和处理都出错了。这又是Lua让人意外的一个地方,我很困惑设计者为什么要这么设计。在Lua 5.3的reference manual文档中,对此有明确说明:
Exponentiation and float division always convert integer operands to floats.
据说5.3版本之前,Lua甚至都不支持整数,只有浮点数。而我们的程序通常只有两种类型:整数和字符串,因此重新将计算结果转换回整数是个急需解决的问题。在翻看manual文档时,看到math.tointeger接口,试了一下,结果极为悲催,返回了nil值!这是搞个毛线啊?
幸运地是lua对C很友好,因此只好手工打造一个接口给Lua程序用:
static int bluaToInt(lua_State *L)
{
assert(NULLP!=L);
int intVal = 0;
int type = lua_type(L,1);
switch( type )
{
case LUA_TNUMFLT:
intVal = (int)luaL_checknumber(L,1);
break;
case LUA_TNUMINT:
intVal=(int)luaL_checkinteger(L, 1);
break;
case LUA_TSTRING:
intVal = BclStrToInt(luaL_checkstring(L,1));
break;
default:
assert(0);
break;
}
lua_pushinteger(L, intVal);
return 1;
}
将上述函数注册到Lua中,定义为“ToInt”,然后在脚本中使用即可。由此上述示例代码变为:
c=ToInt(a/b)
这样就能确保c为整数类型。