and
和or
都是“短路求值(short-cut evaluation)”,也就是说,他们只会在需要时才会去评估第二个操作数,这样便可以保证一些表达式不会导致运行时错误,比如if a ~= nil and a.b == "a"
,若a已经为nil
了则不会计算第二个操作数了,否则若a为nil
时取a.b
则会导致程序gg。- LUA中的下标是以1开始的。
table
中元素最后的逗号是可选的,这样便无须将最后一个元素作为特例来处理。- LUA中可以多重赋值,
a, b = c, d
,最后a == c
,b == d
,同时若两个参数个数不相等,并不会报错,,左边多余的参数会被赋值为nil
,右边多余的值则会被丢弃,通过这种方式就可以同时接收函数的多个返回值,local a, b = test()
,同时因为是先对等号右边的所有元素求值后再进行赋值==
,所以当想交换两个变量时,直接a, b = b, a
即可。 - LUA中仅有
false
和nil
为假,除此之外的值都视为真,数字0和空字符串也是真,所以用if not xxx then
的方式只能判断出xxx
是否为false
或nil
,这样用not xxx
的方式便能很好的进行失败的判断,而不应写死为xxx == nil
或xxx == false
。 - LUA在运行时会自动完成数字与字符串之前的相互转化,但在比较时
数字 == 字符串
时结果总是false
,毕竟是两个不同的数据类型。 - LUA中是将
nil
作为界定数组(表格)结尾的标记,所以local a = {}; a[1000] = 1; print(#a)
的结果为0。 - LUA中可用
_M
来代表模块本身 - LUA中函数与所有其他值(表格等)一样都是匿名的,即他们都没有名称,函数名只是一个持有该函数内容的一个变量,同一个函数可以被不同的变量持有。
- 从技术上将,LUA中只有closure,也即只有闭合函数,函数本身就是一种特殊的closure,一般是用来带指不带“非局部的变量”的closure,而完整的
closure = 该函数 + 该函数所需访问的所有“非局部的变量”
,所以LUA中通过closure让函数能够访问到外部定义的局部变量。 print
默认会输出一个换行,若不需要换行则可以使用io.write
,默认输出到stdin,也即终端