表达式
Lua中的表达式包括数字、字符串、一元和二元操作符、函数调用。还可以是非传统的表构造。
算数表达式
算数表达式是算数操作符及其操作对象所组成的表达式。Lua中算数操作符的操作对象是实数。
Lua中的算数操作符包括:
二元的算数操作符: +-*/^(指数)%(取模)
一元的算数操作符: -(负号)
关系表达式
由关系操作符及其操作对象所组成的表达式就是关系表达式。所有关系表达式的结果均为true或false。
Lua支持的关系操作符有:>、<、>=、<=、==、~=(不等于)。
有几点需注意:
==和~=这两个操作符可以应用于两个任意类型的值。
如果两个值的类型不同,Lua就认为他们不等。nil值与其自身相等。
print("0" == 0) -->false
print(nil == false) -->false
a=3
b=4
c=3
print(a==c) -->ture
print(a~=b) -->false
--特别地,tables、userdata、functions是通过引用进行比较的。也就是说,只有当他们引用同一个对象时,才视为相等。例如:
a = {x=1,y=2}
b = {x=1,y=2}
c = a
print(a==c) -->true
print(b==c) -->false
Lua比较数字按传统的数字大小进行,比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。
print( 3 < 25) -->true
print( “3” <"25") -->false (alphabetical order!)
把字符串或数字用>、<、>=、<=符与不同类型的值比较时,会报错。
print( 3 <“25”) --> attempt to compare number with string
print(5>=false) -->attempt to compare boolean with number
逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来的有意义的式子称为逻辑表达式。
逻辑运算符有3个: and、or、not
逻辑运算符认为false和nil是假(false),其他为真,0也是true。
and和or的运算结果不一定是true和false,而是和它的两个操作数相关。
--[[
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
]]--
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
print(true and false) --> false
print(true or false) --> true
字符串连接
字符串运算符是 .. 。
字符串连接,如果操作数为数字,Lua将数字转成字符串。
print ("hello" .. "everyone") -->helloeveryone
print (2 .. "apples") --> 2apples
s = 2 .. 3
print(s , type(s)) --> 23 string表的构造
表(table)构造器是用于创建和初始化表的表达式。其中最简单的构造器是空构造器{},用于创建空表。
b = {x = 0, y = 1,"Monday", 109}
print(b[1],b[2],b.x,b.y) -->Monday 109 0 1
c = {y = 1,"Monday", x = 0, 109}
print(c[1],c[2],c.x,b.y) -->Monday 109 0 1
上面的四行代码是我用做测试的,为了简便就不贴图了,table.key这个很好说,其次很明显就是table[x]中的x是对应的没有键的值(我是把它理解成键值对了),x是从1开始计算的,依次往后排。
函数
函数有两种用途:
1.完成指定的任务,这种情况下函数作为调用语句使用。例如:
print(8*9,"star" ) --> 72 star
print(os.date()) -->06/23/19 00:39:26调用函数的时候,如果参数列表为空,必须使用()表明是函数调用
2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。例如:
l = string.len(“1234567”)
print(l) --> 7
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足
function f(a, b)
return a and b
end
c = f(3)d = f(3,4)e= f(3,4,5)
print(c, d, e) --> nil 4 4
Lua函数支持返回多个结果值
function foo0 () end -- returns no results
function foo1 () return 'a' end -- returns 1 result
function foo2 () return 'a','b' end -- returns 2 results
1.当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
x,y = foo2() -- x='a', y='b'
x = foo2() -- x='a', 'b' is discarded
x,y,z = 10,foo2() -- x=10, y='a', z='b'
x,y = foo0() -- x=nil, y=nil
x,y = foo1() -- x='a', y=nil
x,y,z = foo2() -- x='a', y='b', z=nil
2.其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
x,y = foo2(), 20 -- x='a', y=20
x,y = foo0(), 20, 30 -- x='nil', y=20, 30 is discarded
print(foo2(), 1) --> a 1
print(foo2() .. "x") --> ax
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4
函数的可变参数
Lua函数可以接受可变数目的参数,在函数形参中用三点(...)表示函数有可变的参数。Lua将函数的可变参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。
在函数参数中,固定参数和可变参数可以一起声明,但是固定参数一定要在变长参数之前声明。
function test(arg1,arg2,...)
--...
end
赋值语句
Lua中的赋值语句和其它编程语言基本相同,唯一的差别是Lua支持“多重赋值”。
local x,y = “test”, 12 -- “test” 赋值给x,12赋值给y
局部变量和块
可以用local来定义局部变量,例如: local a = “china”。local 是保留字,表示该变量是局部变量。和全局变量不同的是,局部变量的作用范围仅限于其所在的程序块。Lua中的程序可以为控制结构的执行体、函数执行体或者是一个程序块。
local x =12
if x >10 then
local x = 0
print(“x=”,x) -- 打印结果是: x= 0 ,而不是12
end
控制语句
1.if语句
if 语句有3种结构:
if condition then
statements
end
if condition then
statements
else
statements
end
if condition1 then
statements
elseif condition2 then
statements
… -- 很多个elseif
statements
end
2.while语句
while 语句语法如下:
while condition do
statements
end
3、for循环
Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
Lua 编程语言中 for语句有两大类:
数值for循环
for var=exp1,exp2,exp3 do
<执行体>
end
var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次"执行体"。exp3是可选的,如果不指定,默认为1。
泛型for循环
泛型for循环通过一个迭代器函数来遍历所有值,类似java中的foreach语句。
Lua 编程语言中泛型for循环语法格式:
--打印数组a的所有值
for i,v in ipairs(a)
do print(v)
end
i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。
--测试
a = {1,2,3,4,5,6,'lua',firstName = 'urien',lastName = 'von'}
for i,v in ipairs(a)
do
print(i .. '->' ..v)
end
执行上面的脚本结果如下:
1->1
2->2
3->3
4->4
5->5
6->6
7->lua
从结果里面可以看出来打印出来的都是“没有键的值”,而一个完整的键值对没有打印出来,这个我理解的是完整的键值对不存在索引值,因为是通过键来取值的,这也应征了上面字符串连接里面的内容解释
4、break 和continue
break 跳出内层循环,continue不会跳出循环,但会结束本次判断。