三四两章内容比较简单就放一起了,话不多说直接开始。
3.1 算术操作符
Lua支持常规的“+”、“-”、“*”、“/”、“%”等操作符,这里不一一例举。这里稍微说一下%(取余)操作符,介绍一些小技巧。
通过 x%1 可以获取x的小数部分,而 x-x%1 则就是x的整数部分,类似的 x-x%0.01则可以获取到x小数点后两位。这些计算方式在别的语言中也可以适用。
3.2 关系操作符
Lua中的关系操作符有<、>、 <=、 >=、 ==、 ~= 6种,结果都为true或false。
在lua中 table、function、userdata 都是引用比较的。只有当他们引用同一个对象时才相等。
a={} a.x=1 a.y=2
b={} b.x=1 b.y=2
c=a
在上面这个简单的示例里,a==c,但a~=b。
3.3 逻辑操作符
Lua中逻辑操作符包括and、or和not。
- and:当第一个操作数为假,则会返回第一个操作数,否则返回第二个操作数,以此类推直到最后一个。
- or:当第一个操作数为真,则返回第一个操作数,否则返回第二个操作数,以此类推直到最后一个。
local x = y or 10
在Lua中经常会用上面的方式赋值默认值,当y为nil时则会赋值10。
function Fun()
local x = nil
return x or 10
end
同样如上面示例,当x为nil时则会返回默认值10。
local max = (x > y) and x or y
在Lua中可以用上面的方式来进行C语言中的三元表达式。
3.4 字符串连接
在Lua中可以用“..”(两个点)连接字符串。这里需要特别注意的是,在Lua中字符串是不可变的值。连接操作符只是创建了一个新的字符串,而不会对原有的字符串做修改。
3.6 table构造式
table的构造和初始化都比较的简单下面直接列举。
- a = {} table最简单的构造方法
- a = { 1,2,3,4,5,6,7,8,9 } table数组的构造方式
- a = { x = 10, y = 20 } table键值对的构造方式
- a = {}; a.x = 10; a.y = 20 同样的table键值对的构造方式
关于table这里需要再提醒一下的是,在Lua中table数组的索引是从1开始的,这里需要格外注意。
4.1 赋值
在Lua中可以在一行中定义多个变量,并且也可以在同一行里进行多重赋值。如下面示例:
Local a, b, c = 1, 2, 3
print(a, b, c) --> 1 2 3
local x, y = 10
print(x, y) --> 10, nil
当然如果没有为每一个变量赋值,则会为nil。
function GetNumber()
return 10, 20
end
local x, y = GetNumber()
print(x, y) --> 10 20
如上面示例,同样在函数返回时,也可以进行多重赋值,第一个返回值会赋值第一个变量,第二个返回值会赋值第二个变量,以此类推。
在赋值这一部分说一个Lua中的特有的小技巧,可以方便交换两个对象中的数值。
local x, y = 10, 20
x, y = y, x
print(x, y) --> 20, 10
local t = { 10, 20 }
t[1], t[2] = t[2], t[1]
print(t[1], t[2]) --> 20, 10
4.2 局部变量与块(block)
通过 local 关键字可以声明一个局部变量,局部变量的生命周期仅在一个代码块中。
do
local x = 10
print(x) --> 10
end
do到end就是一个代码块,x的生命周期就是do到end之间的代码块。
在Lua中应该尽可能的使用局部变量,这是一种比较好的代码风格。优点在于:
- 访问局部变量比访问全局变量的速度更快。
- 使用局部变量也可以避免搞乱全局环境。
- 缩短变量的作用域也可以提高代码的可读性。
4.3 控制结构
Lua提供了其他语言里常有的if then else、while、repeat。
repeat关键字虽然与其他语言不太相同,但与其他语言中的do while是一样的,会先执行repeat until中的代码块,然后在最后判断ture或false是否再次执行,下面举个例子:
local x = 1
repeat
print(x)
x = x + 1
until x > 10
数字型for
在Lua中for有两种形式:数字型for和泛型for,先说说数字型for
for var = exp1, exp2, exp3 do
<代码块>
end
var为临时变量,exp1为初始值。exp2为结束值,exp1>exp2时终止。exp3为步长也就是exp1每次的递增值,默认为1,如果exp3为-1则是递减。exp3是可选的。
泛型for
泛型for是通过迭代器函数来遍历的,常用的迭代器有Lua提供的pairs和ipairs。
pairs主要用于遍历键值对的table,示例:
local table = {}
table.one = 1
table.tow = 2
table.three = 3
table.four = 4
table.five = 5
for key, value in pairs(table) do
print("key:" .. key .. " value:" .. value)
end
--> key:three value:3
--> key:four value:4
--> key:five value:5
--> key:one value:1
--> key:tow value:2
由于table键值对存储数据,所以输出的结果并非顺序的,并且每次输出结果的顺序也不相同。
ipairs是用于遍历数组元素的,同样先举例子:
local table = { 1,2,3,4,5}
for key, value in ipairs(table) do
print("key:" .. key .. " value:" .. value)
end
--> key:1 value:1
--> key:2 value:2
--> key:3 value:3
--> key:4 value:4
--> key:5 value:5
ipairs遍历数组同样是从下标1开始的,一次遍历。当下标中的元素为0时就会结束退出。
虽然pairs也能遍历数组,但速度会远不如ipairs并且也不是顺序的。
关于Lua的表达式和语句就先说这么多,想要掌握的好还是要多写代码。