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进程就 ...
随机推荐
- centos5.5上apache快速安装H264流媒体支持MP4-H264边下边播
2013年的某一天,客户反馈北京同事做的广告视频下载速度好慢,几MB的视频在手机上要下载接近一分钟才能开始播放. 我分析后发现两点:1)托管的服务器没支持流媒体:2)广告视频MP4并非流媒体格式. 对 ...
- Apache和Nginx平滑重启
之前修改了服务器配置都是简单粗暴的用restart重启apache/nginx,据说这样不好.需要平滑重启服务器,避免重启时打断用户行为.然后就根据官方文档了解了一下平滑重启的命令.本文根据Apach ...
- SQL从入门到基础 - 01 数据库开发及ADO.Net
一.数据库概述 1. 用自定义文件格式保存数据的劣势:并发性差,查找数据的速度差. 2. DBMS(DataBase Management System数据库管理系统)和数据库.平时谈到“数据库”的含 ...
- #define 和 typedef场合
#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字.冗长的类型的别名.
- Vim+Taglist+Ctags(源码阅读).
终于搞定了,之前弄那么两天配置,都不成功. 需要软件: ctags taglist 1,ctags. 1)说明: 这个我就不演示了,我的RedHat5.5本身就有ctags. 2)验证ctags是否已 ...
- Zend Framework
参考:http://www.php100.com/manual/ZendFramework/index.html 1.1. 概述 Zend Framework (ZF) 是一个开放源代码的 PHP5 ...
- Php OpenID
也许大家都有这样的经历与烦恼:当你为了使用某个网站的服务时(若你还没在该网站上注册过),你不得不先注册一个帐号.当你在一堆的网站上注册帐号后,你必需面临管理这些帐号的烦恼.也许你会这样考虑,不同网站注 ...
- linux 防火墙--firewalld学习
firewalld是centos7默认的防火墙,相比于iptables重要的优势: 1 支持动态更新: 2 不用重启服务: 同时增加了防火墙的“zone”概念,具体差异没做过多了解,这篇文章只记录fi ...
- OnCreate
用于创建插入符 /* CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm);//得到窗口字体信息 CreateSolidCaret ...
- 3.3.2 嵌入汇编(摘自<linux内核完全剖析>)
内核C语言程序嵌入式汇编代码又叫内联汇编,具有输入和输出参数的嵌入汇编语句的基本格式为: ************************************************** asm( ...