1.局部变量
局部变量的声明关键字:local.
局部变量的作用域是声明块,指的是函数体,或者是一个chunk。
例子:
local a,b=1,10 if a<b then print(a) local a print(a) end print(a,b)
可以用do..end语言来控制局部变量的作用域,例如求解二元一次方程二元一次:
a,b,c=1,4,1 do local a2=2*a local delta=(b^2-4*a*c)^(1/2) x1=(-b+delta)/a2 x2=(-b-delta)/a2 end print(x1,x2)
a2和delta都声明为局部变量,在chunk运行结束之后思动销毁。
在Lua中应当尽可能地去使用local声明,因为:
1)可以不影响全局成员的情况下重复使用变量名;
2)使用局部变量会更快一些;
3)当局部变量的chunk代码执行完毕,局部变量就会自动释放被占用的内存。
还有一个常用的用法就是:
local foo=foo
这样做的用处是:保护全局变量不被修改;快速访问。
2.流程控制
首先要注意一点:除nil和false之外的所有值在判断中都为真,包括0和空字符。
lua中的流程控制主要包括if,while,repeat,各举一例。
if,简单的计算器
print("Input a Formula with two number:") s=io.read() a=string.sub(s,1,1) b=string.sub(s,3,3) op=string.sub(s,2,2) if op == "+" then r = a + b elseif op == "-" then r = a - b elseif op == "*" then r = a*b elseif op == "/" then r = a/b else error("invalid operation") end print(s.."="..r)
while,遍历数组求最大值
a={3213,132,25} local i=1 max=a[1] repeat print(a[i]) if max<a[i] then max=a[i] end i=i+1 until a[i]==nil print("max:"..max)
a={1,23,4,45,64,2,132,25} local i=2 max=a[1] while a[i] do print(a[i]) if max<a[i] then max=a[i] end i=i+1 end print("max:"..max)
3.两种for循环
lua中的阿for循环有两中,numeric for 和generic for
numeric for的基本形式是:
for var=exp1,exp2,exp3 do <something> endexp1是起点,exp2是终点,exp3是步长,可以不写,默认的话为1。
要注意两点:1)三个表达式都只计算一次;2)循环控制变量是局部变量,循环结束之后自动销毁;3)不要试图在循环中改变循环控制变量,结果是不可预测的;4)跳出for循环用break。
generic for是通过迭代器的方式遍历所有元素,例如打印数组:
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} for k,v in pairs(days) do print(k..":"..v) end
下面是一个插入排序的例子:
a={2,321,23123,32,11} --for i=1,5 do -- a[i]=io.read() --end for i=1,5 do k=i for j=i+1,5 do if a[k]>a[j] then k=j end end tmp=a[i] a[i]=a[k] a[k]=tmp end print("After Sort:"); for i=1,#a do print(a[i]) end
break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。
return用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。
Lua语法要求break和return只能出现在block的结尾一句(也就是说:作为chunk的最后一句,或者在end之前,或者else前,或者until前)