Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
赋值语句
注释,单行用(--)来表示;多行用(--[[...]])来标示;
定义,lua中没有定义(申明数据类型),它是通过赋值来确定其数据类型的。
赋值,是改变一个变量的值和改变表域的最基本的方法。a="hello".."world"
Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。a,b=10,2*x<-->a=10;b=2*x
遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:
x,y=y,x --swap'x'for'y' a[i],a[j]=a[j],a[i] --swap'a[i]'for'a[i]'
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
a.变量个数>值的个数按变量个数补足nil;b.变量个数<值的个数多余的值会被忽略
多值赋值经常用来交换变量,或将函数调用返回给变量:a,b=f()--f()返回两个值,第一个赋给a,第二个赋给b。
表达式
表达式---是表达式就需要运算符。
1.算术运算符:+-*/^(加减乘除幂,二元运算符),-(负值,一元运算符);操作跟C++一样
2.关系运算符:<、>、<=、>=、==、~=(不等于);这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。
print((2<15)) --true print(("1"==1))--false print(("2">"15"))--true a={};a.x=1;a.y=0; b={};b.x=1;b.y=0; print((a~=b));--true c=a; print((a==c));--true --Lua比较数字按传统的数字大小进行,比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。 --为了避免不一致的结果,混合比较数字和字符串,Lua会报错,比如:2<"15"
3.逻辑运算符:and、or、not;逻辑运算符认为false和nil是假(false),其他为真,0也是true.
and和or的运算结果不是true和false,而是和它的两个操作数相关。aandb--如果a为false,则返回a,否则返回b;aorb--如果a为true,则返回a,否则返回b;想想堆栈,若第一个变量就可以判断出真假,就不需要判断第二个变量了。
and的优先级比or高。
C语言中的三元运算符,a?b:c ==>>在Lua中可以这样实现:(aandb)orc
not的结果一直返回false或者true
print(notnil)-->true print(notfalse)-->true print(not0)-->false print(notnotnil)-->false
4.连接运算符:..(两个点);如果操作数为数字,Lua将数字转成字符串。
print("Hello".."World")-->HelloWorld print(0..1)-->01
流程控制
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。
do..end(相当于c/c++的{})
if语句,有三种形式
ifconditionsthen then-part end; ifconditionsthen then-part else else-part end; ifconditionsthen then-part elseifconditionsthen elseif-part ..--->多个elseif else else-part end;
由于Lua不支持switch语句,所以这种一连串的if-elseif代码很常见的。
while语句
whileconditiondo statements; end;
repeat-until语句
repeat statements; untilconditions;
条件判断是在循环体之后做的,因此循环体至少会执行一次。类似于C++中的,do..while()
for语句
数字型for(numberfor)
forvar=exp1,exp2,exp3do loop-part end --for将用exp3作为step从exp1(初始值)到exp2(终止值),执行loop-part。其中exp3可以省略,默认step=1
泛型for(genericfor),泛型for循环通过一个迭代器(iterator)函数类遍历所有值。
--打印数组a的所有值 fori,vinipairs(a)doprint(v)end
Lua的基础库提供了ipairs,这是一个用于遍历数组的迭代器函数。在每次循环中,i会被赋予一个索引值,同时v被赋予一个对应该索引的数组元素值。
再看一个遍历表key的例子: --printallkeysoftable't' --forkinpairs(t)doprint(k)end days={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} revDays={} fori,vinpairs(days)do revDays[v]=i --revDays={["Sunday"]=1,["Monday"]=2,["Tuesday"]=3,["Wednesday"]=4,["Thursday"]=5,["Friday"]=6,["Saturday"]=7} end --x="Tuesday" --print(revDays[x])--3
forkinpairs(days)doprint(k)end--1234567 forkinpairs(revDays)doprint(k)end