a = 100 do local a = 5; print(a) --5 end for a=1,3,1 do print(a) --1,2,3 end print(a) --100
do end规定了一个块,循环判断等语句里面也是一个块,在块中的声明local只会在块中生效。
在交互环境中,每一句都会当成一个块,也就是一句local i = 1,下一句i就不存在了,所以要用do end框起来
a,b,c = 1,2 print(c) --无对应的赋值为nil d,f = 1,2,3 print(d,f) --1,2 多余的舍弃了
a = 10 b = 8 a,b = b,a print(a,b) --8 10
在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值。
所以在a赋值为b之前,右边的a已经确定好了是10了
也就是先确定右边的b,a为8,10,然后赋值a=8,b=10。
days = {'Sunday','Monday';2,3,4,5,6} --,;都可以 print(days[1]) --Sunday,Table的索引从1开始 print(days[6]) --5 so = {a='sss',['+']='add',['-']='sub',} print(so['+']) --add,特殊的键值可以用['符号']表示
--x = 10 v = 22 x = x or v --if not x then x = v end print(x) --22 print(22 and 10) --10 print(nil and 10) --nil print(1 or 0) --1 print(nil or 1) --1 print(not 1) --false print(not nil) --true
and关键字 如果第一个操作数为假,就返回第一个操作数;不然返回第二个操作数
or关键字 如果它的第一个操作数为真,就返回第一个操作数,不然返回第二个操作数
not关键字 返回true或false
只能对两个数字或两个字符串做大小比较,其他做相等不等比较。
-- print(2 < '15') 错误的 print(2 < 15) --true print('2' < '15') --false,居然是false print('0asdasdasda'<'15') --true,居然是true
字符串的大小比较,是按照字母的次序来比较的
print("2"<"15") --50 > 49 print(string.byte("2")) --50 print(string.byte("15")) --49 print(string.byte("1")) --49 --print(string.byte("5")) --53
--Lua取模的定义 a % b == a - floor(a/b)*b x = math.pi print(x) --3.1415926535898 print(x % 1) --0.1415926535898,取小数部分 print(x - x % 1) --3,去除小数部分 print(x - x % 0.01) --3.14,保留两位小数,去除其他位小数
有时候,需要在table后面添加多个值,如果table不是有序的索引值,通过table.getn()或#获取的值来往后面添加元素,就有可能覆盖存在的值。如果要保证,获取到的索引后面的值全都是未使用过的,可以通过table.maxn()获取到最大索引值:
a = {} a[1] = 55 a[6] = 5 a['aa'] = 8 a[8] = nil print(table.maxn(a)) --6
可以用长度操作符#和table.getn()获取nil值索引的前一个索引值
比如说:
a = {} a[6] = 5 print(#a) --输出0 a[1] = 55 print(#a) --输出1
也就是说,#和getn()会从table的起始1开始逐步往下找,如果1不存在,那么认为table结束,返回1-1=0;如果1存在,往下找2,2不存在,那么就返回2-1 = 1。
所以,对于有序索引的table可以这样获取到长度,对于,东缺西缺的,这能遍历获取了。
i = 0 for k,v in pairs(a) do --a是table i = i+1 end print(i)
str = 'as5d4a5d4sa5d' print(#str) --13 print(#'123456') --6