|
楼主 |
发表于 2015-6-2 10:08:18
|
显示全部楼层
本帖最后由 ltblue 于 2015-6-2 10:09 AM 编辑
”不知道,大家对集装箱有没有概念,就是那种很大的铁柜子,一般做对外贸易用的比较多,铁柜子打开以后,里面可以放许多纸箱。(我想不需要真的放一张集装箱的图片上来吧?)“说真的,要找装满了纸箱的集装箱图片你未必找得到......
”但总是有些情况是需要数组来解决的“
其实最早学程序的时候,我师父给我出了个题(师父是同学,现在在国家安全局管网络......),就是排序。现在看来排序不是个问题,当年我不懂数组,愣是用if搞定了10个数的排序......师父都崩溃了......然后才发现我还没学到数组那章......
”应该把具有相关性的数据放进一个数组“
其实我现在就犯了一些错误,比如任务数据,到底放到quest数组里,还是sta数组里(sta指状态,原谅我英文不好吧......)。关键我quest数组里全是任务名......
”先说一下,代码开头那行——require "tprint"——这是MUSHclient自带的一个查看数组的扩展,使用很简单,看一下就会,效果不错。“
还有这东西?mush我只看了一个wait.lua,其他一概没用过啊......我输出数组都用”table.concat“,具体啥用法也不知道,百度查的
”但类似t_quests格式也不是完全没有缺点,因为Lua默认的数组下标是从1开始的(这点跟绝大多数的编程语言不同),而且许多内置的操作都是仅针对下标从1开始的数组。当然,解决方案也不是没有,这个请放心。“
实际上,table的两种格式用起来很方便,但问题也很多,光说遍历就得分两种——还未必成功
绝大部分情况下,我都不混用,或者基本不混用,个别的时候混用也很谨慎
比如我的sta_cha函数,就是查看技能的函数,我在sta.cha中,除了有[1][2][3]这样的内容,也有一个特殊的ing="doing",用来确定此函数是否正在运行(没运行完就针对内容处理是很危险的,而我的这个东西放在单独的协程中,所以必须等ing="done",才能确保读取的内容准确,至于为什么放在协程里......我的本意是为了效率,虽然不确定能提升多少)
”
print(t_quest["hyd_city"] ) --显示出城市名
print(t_quest.hyd_name) --显示出任务人名,这里用了另外一种方法,两者是等价的,小刀最近看论坛代码,发现这两种都有人用,特此指出
“
实际应用上,这两者有时候不见得能一起使用,比如
我在一个数组里要查找一个值,这个值的下标是另外一个数组里的一个值
比如我要在map数组里查找下标是where.now的值,我写
map.where.now显然是不合适的
一般我写成
map[where[now]]
就比较方便了
可惜这样的代码会影响多行注释,比如想把这段多行注释掉,我写
--[[,就会碰到这样里的]],然后注释就停掉了
当然,写成map[where.new]也是没问题的,我只是举个例子
”先要说明一点,这里的遍历,是指读取数组内每一个值,而不是北侠论坛机器人版上一直比较神秘的遍历。按北侠机器人守则,这个是不允许讨论了,抱歉了。“
啊?版规还不让谈遍历?我才知道。但我记得在论坛里看过谈遍历的帖子啊,还有画图呢,奇怪了
”数组的遍历,是一个实用性比较强的功能,但因为Lua比较坑爹的table功能,在使用过程中需要比较小心,不然的话会出一些很麻烦的错误,下面会详细说明。“
深表同感,感同身受。不过table真心方便啊。lua本身就是个及其方便的语言,各种不规范,但出错也难找反正......变量名写错了我都不知道......有一次命名是score,我写成了scroe,愣是找了好久......
”要在循环结束时将需要的值取出“
应该是作用域的事吧?for的都是局部变量
”在实际工作中,一般建议使用方案C来代替方案A。一来,两者使用效果基本一样,方案C的书写更简单一些。二来,细心的同学可能会发现,方案A和方案B实在太接近了,两者就差了一个字符。哪怕是为了减少误写的可能,也是选择方案C比较好一些。“
实际上,我一直保持的是方案c来写,不过那个#我不懂,我一般是这样
for i=1,table.getn(tablename) do
就是取一下最大值
不过我的table都是连续的,没出现不连续的情况,可能是危险的举动吧?
”在这里给诸君留一个作业,根据上面的代码和运行结果,能分析出什么注意点吗?“
这就是table坑爹的一个部分了——顺序未知
鬼知道会以什么顺序遍历......
用在其他地方还好,用在地图文件里,由于人要看的嘛,就会非常的莫名其妙,出现很多可笑的东西
不过我在网上找到了一些代码,可以对table进行排序,方便多了
function pairsByKeys(t)
--按顺序的pairs
local a = {}
for n in pairs(t) do
a[#a+1] = n
end
table.sort(a)
local i = 0
return function()
i = i + 1
return a, t[a]
end
end
具体啥意思我也不知道,反正好用就是了...... |
|