lua中的坑
在工作中使用lua也有一年了,代码也写了不少,踩过不少坑,这里记录一下。
- table.sort
table.sort是lua自带的排序函数,数据量小时,也还是不错的。不过要注意你传入的compare函数。例如:
local tb = { ,,,,,,, } table.sort( tb,function(a,b) return a>=b end )
上面的代码够简单了,但是你运行起来,却是报错了。
Program starting as '"D:\programs\ZeroBraneStudio\bin\lua53.exe" -e "io.stdout:setvbuf('no')" "D:\work_code\lua\Test\Test.lua"'.
Program 'lua53.exe' started in 'D:\work_code\server' (pid: ).
D:\programs\ZeroBraneStudio\bin\lua53.exe: D:\work_code\lua\Test\Test.lua:: invalid order function for sorting
stack traceback:
[C]: in function 'sort'
D:\work_code\lua\Test\Test.lua:: in main chunk
[C]: in ?
Program completed in 0.04 seconds (pid: ).
原因在于compare函数中不能出现等于,即a>b或a<b都OK,但不能是a>=b或a<=b。如果使用了=,当数组中出现两个权重一样的元素时,就会报错。具体原因你可以看table.sort的官方文档,有句话:
If comp is given, then it must be a function that receives two list elements and returns true when the first element must come before the second in the final order (so that, after the sort, i < j implies not comp(list[j],list[i]))
如果是报invalid order function for sorting也就罢了,网上查一下就能找到答案。然而我在项目中的报错却比较奇怪:
function Society_city:do_player_hurt_sort()
local player_hurt = {}
for ty,hurt_info in pairs( self.player_hurt ) do
for pid,info in pairs( hurt_info ) do
local _info = {}
_info.ty = ty
_info.pid = pid
_info.hurt = info.hurt
_info.times = info.times table.insert( player_hurt,_info )
end
end table.sort( player_hurt,function(a,b) return a.hurt >= b.hurt end ) return player_hurt
end
报错信息为:
society_city.lua:: attempt to index local 'a' (a nil value)
我一直以为是数组中加入了一个nil,但查了半天,原来是>=的原因。
- table编译
在我们的项目中,策划将配置填到excel表,然后用工具将excel表批量转为lua表作为配置。这样在lua中直接require就可以使用配置了。转出来的配置表通常是这样的:
local t =
{
[] =
{
['id'] = ,
['icon'] = ,
['name'] = '默认头像框',
['description'] = '初始赠送',
['type_id'] = ,
['sort'] = ,
}, [] =
{
['id'] = ,
['icon'] = ,
['name'] = '10级头像框',
['description'] = '达到$1级即可获得',
['type_id'] = ,
['num'] = ,
['sort'] = ,
}, [] =
{
['id'] = ,
['icon'] = ,
['name'] = '20级头像框',
['description'] = '达到$1级即可获得',
['type_id'] = ,
['num'] = ,
['sort'] = ,
}, [] =
{
['id'] = ,
['icon'] = ,
['name'] = '30级头像框',
['description'] = '达到$1级即可获得',
['type_id'] = ,
['num'] = ,
['sort'] = ,
}, [] =
{
['id'] = ,
['icon'] = ,
['name'] = '40级头像框',
['description'] = '达到$1级即可获得',
['type_id'] = ,
['num'] = ,
['sort'] = ,
}, [] =
{
['id'] = ,
['icon'] = ,
['name'] = '50级头像框',
['description'] = '达到$1级即可获得',
['type_id'] = ,
['num'] = ,
['sort'] = ,
}, [] =
{
['id'] = ,
['icon'] = ,
['name'] = '60级头像框',
['description'] = '达到$1级即可获得',
['type_id'] = ,
['num'] = ,
['sort'] = ,
}, }
在某些功能中,是需要将id从小到大遍历的。由于策划配置时总是严格按小到大的,转换出来的配置表key值也是从小到大的。然而,当我们require这个table时,顺序却是乱的。即
for k,v in pairs( t ) do
print( k,v )
end
输出:
Program 'lua.exe' started in 'D:\work_code\server' (pid: ).
table: 0x003d8ff8
table: 0x003d92c8
table: 0x003d90e8
table: 0x003d8a58
table: 0x003da560
table: 0x003d91d8
table: 0x003d92f0
Program completed in 0.03 seconds (pid: ).
这样的代码,第一个取得的id并不一定是1。也就是说,lua虚拟机在编译这个文件时,里面的元素并不是按顺序的,即使key值是int型并且按从小到大并严格自增。
lua中的坑的更多相关文章
- Gink掉过的坑(一):将CCTableView导入到lua中
环境: 系统:win7 64位 cocos2dx:cocos2d-2.1rc0-x-2.1.3 Visual Studio: 2012 由于项目是用lua写的,需要将cocos2dx中的方法导入到lu ...
- Torch-RNN运行过程中的坑 [2](Lua的string sub函数,读取中文失败,乱码?)
0.踩坑背景 仍然是torch-rnn/LanguageModel.lua文件中的一些问题,仍然是这个狗血的LM:encode_string函数: function LM:encode_string( ...
- Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)
0.踩坑背景 执行Torch-RNN的时候,在LanguageModel.lua中的encode_string函数中,对start_text的各个character进行id映射编码,实现功能类似“北京 ...
- 在redis一致性hash(shard)中使用lua脚本的坑
redis 2.8之前的版本,为了实现支持巨量数据缓存或者持久化,一般需要通过redis sharding模式来实现redis集群,普遍大家使用的是twitter开源的Twemproxy. twemp ...
- lua中遍历table的几种方式比较
当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...
- Torch-RNN运行过程中的坑 [0](一些基础概念)
0.Lua & LuaJIT简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua 是巴 ...
- 从架构层面杜绝lua中使用未定义的变量
# 从架构层面杜绝lua中使用未定义的变量 标签(空格分隔): lua --- lua中有一个很坑的地方:1.就是如果一个变量拼写错误,会自动的认为你定义了一个值为nil的全局变量.2.如果在func ...
- lua中基类和“继承机制”
基类:基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法. 继承:继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类. lu ...
- lua中实现异步资源读写
同样还是更新方面的需求,当我们检测到版本是新安装的以后,要进行upd目录清除.如果使用os.execute执行 rm -rf ooxx 是非常快的但由于os.execute一旦报错,那整个lua进程就 ...
随机推荐
- JAVA - 回调机制
参考例子:android的Button OnClickListener接口.<第一行代码>中的回调例子 定义接口 public interface HttpCallbackListen ...
- IO-文件 File 复制 读写 总结
一定要注意: 传入的参数,应该是包含文件名的完整路径名,不能把一个文件复制到[文件夹]中,因为[文件夹]本身是不能有输入输出流的,只能复制到一个[文件]中,否则会报异常. 以字节流读写的三种方式 pu ...
- img图片元素下多余空白解决方案
在进行页面的DIV+CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对於 该问题的解决方法也是「见机行事」,根据原因的不同要用不同的 ...
- CriticalFinalizerObject的作用
CriticalFinalizerObject 在从 CriticalFinalizerObject 类派生的类中,公共语言运行库 (CLR) 保证所有关键终止代码都有机会执行, 即使是在 CLR 强 ...
- rsync从windows到linux的同步备份
名称 角色 IP地址 Windows server 2003 服务器 Eth0:192.168.1.1 RHEL5.5 客户端 Eth0:192.168.1.2 一.cwRsyncServer服务 ...
- 电厂MIS,SIS简介
MIS(Management Information System)管理信息系统,主要指的是进行日常事务操作的系统,它使管理人员及时了解公司现状和各种消息,它是电力企业管理现代化的重要标志. 一个典型 ...
- php中bindValue的批量提交sql语句
php预编译sql语句,可以批量提交sql,也可以实现防注入 <?php $dsn='mysql:host=127.0.0.1;port=3306;dbname=bisai'; $usernam ...
- C#操作MYSQL遇到0000-00-00日期报错的原因
今天在做一个C#连接MYSQL数据库,并读取数据库的内容,遇到了0000-00-00日期转换报错:unable to convert MySQL date/time value to System.D ...
- Canvas前端游戏开发——FlappyBird详解
一直想自己做点小东西,直到最近看了本<HTML5游戏开发>,才了解游戏开发中的一点点入门知识. 本篇就针对学习的几个样例,自己动手实践,做了个FlappyBird,源码共享在度盘;也可以参 ...
- linux笔记2.25
解决vsftpd用root登录不了的问题 把/etc/pam.d/vsftpd文件中的 auth required pam_listfile.so item=user sense=d ...