读一读

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