资料摘自<Lua程序设计(第二版)>
表达式
算术操作符
Lua支持的常规算术操作符有:二元的"+"(加法)、"-"(减法)、"*"(乘法)、"/"(除法)、"^"(指数)、"%"(取模),一元的"-"(负号)。所有这些操作符都可用于实数。例如,x^0.5将计算x的平方根,x^(-1/3)将计算x立方根的倒数。
关系操作符
Lua提供了以下关系操作符:
< > <= >= == ~=
所有这些操作符的运算结果都是true或false
操作符==用于相等性测试,操作符~=用于不等性测试。这两个操作符可以应用于任意两个值。如果两个值具有不同的类型,Lua就认为它们是不相等的。否则,Lua会根据它们的类型来比较两者。特别需要说明的是,nil只与其自身相等。
对于table、userdata和函数,Lua是作引用比较的。也就是说,只有当它们引用同一个对象时,才认为它们相等。例如,以下代码:
a = {};a.x = 1;a.y = 0
b = {};b.x = 1;b.y = 0
c = a
其结果是 a==c,但 a~=b
只能对两个数字或两个字符串作大小比较。Lua是按照字母次序比较字符串的,具体的字母次序取决于对Lua的区域设置。
逻辑操作符
逻辑操作符有and、or和not。与条件控制语句一样,所有的逻辑操作符将false和nil视为假,而将其他的任何东西视为真。对于操作符and来说,如果它的第一个操作数为假,就返回第一个操作数;不然返回第二个操作数。对于操作符or来说,如果它的第一个操作数为真,就返回第一个操作数;不然返回第二个操作数。
print(4 and 5) -->5
print(nil and 13) -->nil
print(false and 13) -->false
print(4 or 5) -->4
print(false or 5) -->5
操作符not永远只返回true或false:
print(not nil) -->true
print(not false) -->true
print(not 0) -->false
print(not not nil) -->false
字符串连接
要在Lua中连接两个字符串,可以使用操作符".."(两个点)。如果其任意一个操作数是数字的话,Lua会将这个数字转换成一个字符串:
print("Hello".."World") -->Hello World
print(0..1) -->01
请记住,Lua的字符串是不可变的值。连接操作符只会创建一个新字符串,而不会对其原操作数进行任何修改:
a = "Hello"
print(a.." World") -->Hello World
print(a) -->Hello
table构造式
构造式是用于创建和初始化table的表达式。这是Lua特有的一种表达式,并且也是
Lua中最有用、最通用的机制之一。
最简单的构造式就是一个空构造式{},用于创建一个空table。构造式还可以用于初始化数组。例如,以下语句:
days = {"sunday","monday","tuesday","wednesday","thursday","friday","saturday"}
会将days[1]初始化为字符串"sunday"、days[2]初始化为"monday",以此类推。(这种是列表风格的初始化)
a = {x=10,y=20} --这种是记录风格的初始化
以上代码等价于:
a={};a.x=10;a.y=20
以上两种风格的构造式各有限制。Lua提供了一种通用的格式,这种格式允许在方括号之间,显式地用一个表达式来初始化索引值:
opnames = {["+"]="add",["-"]="sub",["*"]="mul",["/"]="div"}
a={[20]="b",[21]="c",[22]="d"}
无论是列表风格,还是记录风格,都是这种通用语法的特例。构造式{x=0,y=0}等价于{["x"]=0,["y"]=0},构造式{"r","g","b"}等价于{[1]="r",[2]="g",[3]="b"}。
无论使用哪种方式来创建table,都可以在table创建之后添加或删除其中的某些字段:
w={x=0,y=0,label="console"}
x={math.sin(0),math.sin(1),math.sin(2)}
w[1] = "another field" --添加key 1到table w
x.f = w --添加key "f"到table x
print(w["x"]) -->0
print(w[1]) -->another field
print(w.f[1]) -->another field
w.x = nil --删除字段"x"