算术运算符

二元运算符:+-*/^(加减乘除幂)
一元运算:-(负值)

关系运算符

<  >  <=  >=  ==  ~=

如果两个值类型不同返回结果都是false。nil只能和自己相等。Lua通过引用比较tables,userdata,functions。也就是当且仅当两个表示同一个对象时候相等。类似OC的比较。

"0" == 0      -- false
2 < 15        -- true

"2" < "15"    -- false (alphabetical order!)

为了避免不一致的结果,混合比较数字和字符串大小,Lua会

逻辑运符

and  or  not

and 和 or 的运算结果不是 true 和 false,而是和它的两个操作数相关。

a and b -- 如果 a 为 false,则返回 a,否则返回 b
a or b -- 如果a为true,则返回a,否则返回b

C 语言中的三元运算符

a?b:c

在 Lua 中可以这样实现:

(a and b) or c

not 的结果只返回 false 或者 true

print(not nil)--> true
print(not false)--> true
print(not 0)--> false
print(not not nil)--> false

连接运算符

.. --两个点

字符串连接,如果操作数为数字,Lua 将数字转成字符串。

优先级

从高到低的顺序:


^(幂)
not - (unary) 
*  / 
+  -
..
< > <= >= ~= ==
and
or

除了^和..外所有的二元运算符都是左连接的。

表的构造

构造器是创建和初始化表的表达式。表是 Lua 特有的功能强大的东西。最简单的构
造函数是{},用来创建一个空表。

days = {"Sunday", "Monday", "Tuesday", "Wednesday",
              "Thursday", "Friday", "Saturday"}

表的索引是从1开始所以days[1]是Sunday

我们可以初始化表为一个Record来使用

a = {x=0, y=0} <--> a = {}; a.x=0; a.y=0//先建空表,再添加域。

这里的x和y我们可以叫它为域。
注意:以Record方式的表我们要用访问字符串索引的是访问域里面的值。
每次调用{}构造函数,lua都会创建一个心的table。

在同一个构造函数中可以混合列表风格和 record 风格进行初始化,如:

polyline = {color="blue", thickness=2, npoints=4, 
            {x=0, y=0},--这里是polyline[1]
            {x=-10, y=0}, --这里是polyline[2]
            {x=-10, y=1}, --这里是polyline[3]
            {x=0, y=1}--这里是polyline[4]
}

使用字符串索引初始化必须使用[]来包含字符串如:

a = {["mm"]=100}
a['mm']--> 100

我们也可以用[]来初始化数字索引表。这样我们可以以某个索引开始初始化表如:

{"red", "green", "blue"} <-->
                 {[1]="red", [2]="green", [3]="blue"}

注意:如果是数字索引的时候不能使用负索引初始化一个表中元素,但是我们可以从0开始,不推荐数组下标从 0 开始,否则很多标准库不能使用(新版Lua支持从负数开始初始化表)。

在构造函数中域分隔符逗号(“,”)可以用分号(“;”)替代,通常我们使用分号用来 分割不同类型的表元素。

{x=10, y=45; "one", "two", "three"}