Lua 开发过程中常见坑
Lua next
return _G.next( tb ) == nil;
_G表是Lua全局表,所有Lua中定义的函数和变量都在其中可以找到,所以通过_G表找到的next为Lua语法中的next。而next通常用为判断一个表是否为空。原型为:next(table[,index]) 。参数1是table,参数2为可选填的索引值,若缺省则默认为0。
语法为:从参数2(index)的后一位开始遍历参数1(table),直至遇到值为非nil才返回,返回值有两个:索引,值。如果遍历完整个表都没有 遇到非nil的值,那么返回nil。
Lua SetBit
顾名思义,就是对一个整型(比如四个字节)的指定位段设置执行的数(0或1),那么这时务必注意,如果是从前(32位)往后利用整型的位数,那么需要注意,整型的第32位表示的是正负,也就是说如果我们更改了最高位,会出现意想不到的问题。
TIPS:同时需要注意的是Lua中整型不是32位的。
Lua 值类型与引用类型
我们知道在Lua中分值类型和引用类型,而且Table作为一个典型的引用类型,如下:
a = {1,2,3}
b = a
b[1] = 2
print(a[1])
也就是说,所有对一个table类型赋值给另外一个变量的操作,并不是copy一份,而是一个引用,仍然指向同一片内存空间。
也就是说,我们在对一份模板table进行copy时,而是得将遍历一次,将这个模板table的所有key得一次次赋值给另外一个table(下述给出模板)。
function CopyTB(tb)
local tbCopy = {};
for k, v in pairs(tb) do
if type(v) == "table" then
tbCopy[k] = CopyTB(v);
else
tbCopy[k] = v;
end
end;
return tbCopy;
end
Lua 匿名函数
function X:OnStart()
self.TimerID = Timer:Register(400, function ()
self:_SendRankMail()
end)
end
从上述代码,可以发现,我们在注册定时器时只是传入一个匿名函数,但是却能在匿名函数内部访问self(因为注册匿名函数意味着异步,无法保证X这个实例的生命周期在调用这个匿名函数时仍然存在,且我们没有传入self),这就是Lua中的闭包,如果匿名函数内部使用了当前作用域(与Timer:Register同级的作用域)的变量,比如self,Lua会默认将匿名函数内部使用的变量引用传递至匿名函数内部,但是如果是一个local类型的引用类型变量,需要注意其生命周期,不然会出现不可预知的错误。
for循环中有一个现象需要留意:
for i = 1, 10, 1 do
end
TIPS:在Lua中,for循环的迭代器i每次循环都是回申请新的内存空间,即i = i + 1,每次等号左侧的i都是在一片新的内存空间中。
同时我们知道,self:function和self.function的区别,self:function 等价于 self.function(self)。那么这里问题来了,self[function]需要传递参数吗?答案是需要的,跟.号访问是相同的。
Lua 除法
local a = 5
local b = 2
local c = a / b
也就是说我们在使用Lua进行开发的过程中,在进行整型相除的过程中,不要想当然的认为Lua会帮我们把将小数点后面的位数省略!应该使用local c = math.floor(a / b)即可。
Lua math.random
通常来说,我们如果要保持每次随机值的具备随机性(即公平),需要如下这么做:
function Random()
math.randomseed(os.time())
local nRandomNum = math.random(1, 100)
end
但是当我们进行如下操作时,会发现随机数具备一定的局限性:
for i = 1,100,1 do
print(Random())
end
运行结果表明概率具有一定的局限性,它的随机结果总是十几左右。我们知道Lua是使用C语言实现的,那么其内部的概率模型也是采用C语言的,而C语言采用的随机模型确实具备这么一个局限性。
解决方案:①自己实现一个具备随机性的概率模型;②Random()函数按照如下方式定义即可解决:
function Random()
local nSeed = os.time() * 1000 + tonumber(tostring({}):match("%d+"))
math.randomseed(nSeed)
local nRandomNum = math.random(1, 100)
end
TIPS:也就是说归根究底是os.time()变化的比较微小,我们只需要增大os.time()的变化即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)