Lua基础(一)——赋值语句、表达式、流程控制、函数
赋值语句
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,而是和它的两个操作数相关。a?and?b?--?如果a为false,则返回a,否则返回b?;a?or?b?--?如果a为true,则返回a,否则返回b?;想想堆栈,若第一个变量就可以判断出真假,就不需要判断第二个变量了。 and的优先级比or高。 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 4.连接运算符:..?(两个点);如果操作数为数字,Lua将数字转成字符串。 print("Hello " .. "World") --> Hello World print(0 .. 1) --> 01 流程控制控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。 do..end(相当于c/c++的{}) if语句,有三种形式?if conditions then then-part end; if conditions then then-part else else-part end; if conditions then then-part elseif conditions then elseif-part .. --->多个elseif else else-part end; 由于Lua不支持switch语句,所以这种一连串的if-else?if代码很常见的。 while语句while condition do statements; end; repeat-until语句repeat statements; until conditions; 条件判断是在循环体之后做的,因此循环体至少会执行一次。类似于C++中的,do..while() for语句
for var=exp1,exp2,exp3 do loop-part end --for将用exp3作为step从exp1(初始值)到exp2(终止值),执行loop-part。其中exp3可以省略,默认step=1
--打印数组a的所有值 for i,v in ipairs(a) do print(v) end Lua的基础库提供了ipairs,这是一个用于遍历数组的迭代器函数。在每次循环中,i会被赋予一个索引值,同时v被赋予一个对应该索引的数组元素值。 再看一个遍历表key的例子: -- print all keys of table 't' --for k in pairs(t) do print(k) end days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} revDays = {} for i,v in pairs(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 for k in pairs(days) do print(k) end --1234567 for k in pairs(revDays) do print(k) end 标准库提供了几种迭代器,包括用于迭代文件中每行的(io.lines)、迭代table元素的(pairs)、迭代数组元素的(ipairs)、迭代字符串中单词的(string.gmatch)等。 break和return语句函数function foo(a,b,c) local sum = a + b return sum,c --函数可以返回多个值 end r1,r2 = foo(1,'123','hello') --平行赋值 print(r1,r2) --124 hello
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |